BugkuCTF web sql注入2

页面post方式提交表单;

所有按钮都不好用;

f12检查看到action到login.php,访问一下,username和password都需要填写;

输入用户名直接提交提示用户名和密码都需要填写;

后台扫描没有结果;

经过一些列输入测试,判断admin就是用户名,但是密码不知道;

初步判断为post提交sql注入,'单引号验证一下 admin' -- #

判断应该就是这道题目就是考察的sql注入了(虽然题目也告诉了是sql注入题…)

结果存在waf;题目提示都被过滤了,用字典排查一下都过滤了哪些字符,果然过滤了很多
BugkuCTF web sql注入2_第1张图片
剩下可以使用的字符也就是题目给的那几个字符了!,!=,=,+,-,^,%

这里就是用-来进行注入


预备知识:mysql在一些运算符进行运算的时候会先观察左右两端的数据类型是否相同;不同的话就会进行数据强制的转换。

先查询表中所有数据
BugkuCTF web sql注入2_第2张图片
然后使用select * from t where name=0时,会将name的值转成数值型(将前面数值部分截断出来),admin会变成0,而1admin就会变成1.
BugkuCTF web sql注入2_第3张图片

然后来看-:使用select * from t where name='admin'-0-'';意思是字符串-0-字符串
会强制转换成0-0-0,所以结果就是0
BugkuCTF web sql注入2_第4张图片


主要手段就是通过burp抓包修改uname值进行布尔报错注入
其实也可以直接在网页上写payload,不过每次都刷新比较麻烦,burp省事些
BugkuCTF web sql注入2_第5张图片
BugkuCTF web sql注入2_第6张图片

正常情况下就应该爆库名了ascii(substr((database()),1,1))=1,但逗号和空格被过滤了;空格用()代替

而且个人感觉这样好像不能按照普通方法去一点一点的爆表字段啥信息的。

这里就可以分两种情况,一种可能就是弱口令,最终admin123就是密码

第二种就是根据网页表单中的passwd来看这个字段的信息,试一下果然有这个字段
BugkuCTF web sql注入2_第7张图片
接下来就得一位一位的查passwd了

只用from的话,就会把对应查询位置的字符以及后面的字符全部查询显示出来

只要用ascii码做比较,只会比较查询出来的第一个字母的ascii码

ascii(substr((passwd)from(1)))=48ascii(substr((passwd)from(32)))=48

查出来是个md5值,解码一下是admin123

登录后就进了后台,输入ls爆出flag

你可能感兴趣的:(CTF,web)