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)),會導致溢出從而可能出現報錯。
