SQL注入常用函數和關鍵字總結


1.database()

該函數可以顯示當前正在使用的數據庫庫名。

2.mid()

該函數可以從指定的字段中提取出字段的內容。

mid(column_name,start[,length])

select mid(name,1) from user;
/*start要求最小從1開始!!!*/
/*從password這一列的每一個元素的第一個字符開始截取*/
/*注意得到的是整整一列的內容*/

舉例:

select * from user;
name password
admin admin
root root
select mid(name,1,2);
name
ad
ro

3.substr()

這個函數很常用,有三個參數,按順序分別是字符串,起始位置和長度。可以求指定字符串的子串。當然,第一個參數可以是列的名字。這個函數似乎和mid沒有什么不同,如果mid或者substr中的某一個函數被禁了就用另一個。

4.ord()

該函數用於獲得某個字符串最開始的字符的ASCII值。

5.ascii()

目前未發現與ord的不同。不過這樣也有很大好處,那就是,如果SQL注入的題目中過濾了or,ord函數會躺槍,可以用ascii函數替代。

6.limit和offset

limit和offset均用於限制查詢結果顯示的行數。

limit后面可以有1個或兩個參數。

給出一個mysql庫user表的某一列:

host
host
host
localhost
localhost

一個參數時

select host from user limit 2;
/*limit 0會得到空集合
limit大於查詢結果返回的行數時,顯示全部結果
limit負值會報錯
*/
host
host
host

兩個參數時,第一個參數表示開始位置(0作為最開始的位置),第二個參數表示顯示的行數。

select host from user limit 1,2;
/*當參數一過大時,得到空集合
參數二過大時,從參數一的位置開始顯示剩余的全部結果
*/
host
host
localhost

offset必須與limit結合着來用。

select host from user limit 1 offset 2;
/*表示從第二個開始,顯示一條數據*/
/*
limit后面的參數總是限定顯示多少條,明白這一點就不會錯了
*/

7.concat()

可以將多個字符串連接起來,參數個數無限。但是需要注意的地方就是,如果有一個參數的值是NULL,那么整行結果就會返回一個NULL。

舉個例子

select concat(user,' ',host)contest from user where host='localhost';
contest
ftp localhost
geez localhost
mysql.sys localhost
root localhost
stone localhost
temp localhost
select concat('aaa','kkk',NULL);

結果是NULL。

8.group_concat()

該函數可以將查詢結果連成一行,如果只查詢一列,默認用逗號分隔;如果查詢多列,每一行的查詢結果會直接進行字符串連接,行之間默認用逗號分隔。需要注意的是,用於分隔的默認字符可以修改。

舉個例子:

select group_concat(username,password)result from users;
result
admin21232f297a57a5a743894a0e4a801fc3,testc4ca4238a0b923820dcc509a6f75849b

9.updatexml()

這個主要是填寫錯誤的xpath參數使查詢報錯,報錯時會把xpath位置的查詢結果暴露出來。

如果關了回顯的話就不要用這個了,可以考慮時間注入。

用法舉例

select updatexml(1,concat(0x7e,version(),0x7e),1);

第二個參數由於不符合xpath的規范,會報錯。報錯的時候會把version()執行的結果報出來,假設查詢了flag,錯誤回顯中會出現flag。

ERROR 1105 (HY000): XPATH syntax error: '~5.7.17~'

10.left()

該函數是一個字符串處理函數,用法實例:

select left('2019',2);

返回的結果為:20。

11.right()

這個和left對比着記,用法實例:

select right('2019',2)

返回的結果為:19。

很明顯,substr完全可以取代left和right兩個函數,但是如果substr和mid被禁了,left和right就可以結合着用。

12.elt()函數

elt(n,str1,str2,str3);

該函數的作用是,返回參數中的第n個字符串,參數可以是字符串常量或者列名。

比如:

select elt(2,'888','666');

其返回的結果是666。

如果第一個參數是0,則返回NULL。並且如果第一個參數是0,后面無論是什么,都不會考慮了,如果是函數,則不會運行了。

13.sleep()

該函數的參數是一個整數t,可以在執行某操作后延遲t秒而不進行任何操作。該函數常用於處理沒有回顯的SQL注入,根據響應的時間來確定被注入的SQL語句是否執行成功了。

14.length()

該函數的參數可以是字符串,或者列名。該函數的作用是獲取字符串的長度。比如:

select length('test');

得到的結果是4。

15.rand()

該函數用於產生一個隨機數,可以接受一個參數作為種子,也可以直接使用。

select rand();

16.floor()

該函數用於將一個浮點數向下取整得到整數,可以與rand函數配合使用。在特定情況下,rand、floor、count(*)配合group by可以進行報錯注入。

關於rand、floor、count(*)和group by進行報錯注入的方法幾原理,可以參考以下文章:https://www.2cto.com/article/201604/498394.html

17.exp()

這是一個數學函數,可以求e的多少次冪,當參數過大時會因為溢出而報錯。使用該函數時,通常將查詢結果取反以便得到一個非常大的數。用法如下:

select exp(~(select*from(select user())x));

得到的結果為:

DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'

有一個需要注意的點就是版本問題,並不是所有的版本都可用。

18.hex()

這個函數主要用於獲取字符串對應的十六進制值。用法如下:

select hex('users');

得到的結果為:7573657273。

19.order by

order by是mysql中對查詢數據進行排序的方法,后面可以跟列名或者列號(數字),兩種寫法等價。在sql注入中,該關鍵字經常被用來測試一個表中有多少列,(union select 1,1,1,1,……也可以用來測試有多少列。)也有一些其它騷操作可以玩。可以參考如下博客來漲一些姿勢:https://yang1k.github.io/post/sql注入之order-by注入/

用法:

select * from users order by 1;
select * from users order by username; 

order by在特殊情況下可以繞過預編譯,因為order by如果后面填寫內容的話,只能跟列名或者列號。注意列名和字符串完全是兩碼事,字符串是帶引號的,而列名是沒有的。所以如果order by后面需要拼接用戶輸入的內容,那就可以進行操作,比如order by 1^(ord(length(database())>10)),會導致溢出從而可能出現報錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM