官术网_书友最值得收藏!

2.4 'or'='or’繞過不安全的登錄框

SQL注入攻擊,總是存在于網(wǎng)頁各種用戶數(shù)據(jù)提交的地方,而登錄框在一個(gè)網(wǎng)頁中是最常見的,那么必然有針對(duì)登錄框的SQL注入式攻擊存在。其中,最典型的就是’or'='or’注入漏洞。

'or'='or’漏洞是一個(gè)比較老的漏洞了,凡是講述SQL注入的文章,大部分都會(huì)提及到這個(gè)登錄密碼驗(yàn)證漏洞,這個(gè)漏洞曾經(jīng)在網(wǎng)上非常普遍,許多網(wǎng)站都遭受過該漏洞的攻擊。

'or'='or’漏洞主要是出現(xiàn)在網(wǎng)站的用戶登錄提交頁面中,利用這個(gè)漏洞,攻擊者可以不用輸入密碼就直接進(jìn)入系統(tǒng)的后臺(tái)。它出現(xiàn)的原因是,在編程時(shí)邏輯上考慮不周,同時(shí)沒有對(duì)單引號(hào)或危險(xiǎn)的字符進(jìn)行過濾,從而導(dǎo)致了漏洞的出現(xiàn)。

前面簡(jiǎn)單地演示了一下漏洞攻擊的效果,但沒有講解其中的攻擊原理。下面我們?cè)敿?xì)地向讀者介紹接觸一下’or'='or’注入的原理及方法。

2.4.1 'or'='or’攻擊突破登錄驗(yàn)證的演示

前面打造的漏洞站點(diǎn),可以使用’or'='or’攻擊突破登錄密碼的驗(yàn)證,但是返回的信息不多,因此不便于原理的講解。下面,在網(wǎng)站隨意挑選了某個(gè)站點(diǎn),用以演示’or'='or’攻擊及原理講解。

網(wǎng)站“http://www.yelang.cn/lt/”是一個(gè)普通的小論壇,這類論壇的安全性往往不好,很有可能存在著各種腳本漏洞。在論壇的首頁中,有用戶登錄提交框。在用戶名和密碼中分別輸入任意字符,再加上一個(gè)單引號(hào)進(jìn)行測(cè)試,如提交(圖45):

用戶:admin’

密碼:123456

然后點(diǎn)擊【登錄】按鈕,結(jié)果出現(xiàn)如圖46所示的返回錯(cuò)誤,說明存在SQL注入的可能。

圖45 論壇登錄頁面

圖46 返回的錯(cuò)誤信息

現(xiàn)在在用戶名中輸入任意字符,假設(shè)為“admin”,在密碼中輸入“a' or '1=1--”,單擊【登錄】按鈕后,就可以順利地進(jìn)入論壇了(圖47)。

圖47 突破密碼驗(yàn)證成功登錄

為什么不用輸入正確的密碼,都能夠登錄進(jìn)入后臺(tái)呢?在剛才返回的錯(cuò)誤信息中有如下語句:

            語法錯(cuò)誤 (操作符丟失) 在查詢表達(dá)式 ' FORUM_MEMBERS.M_NAME = ' admin'
            ' AND FORUM_MEMBERS.M_PASSWORD = ' admin' ' AND FORUM_MEMBERS.M
            _STATUS = 1' 中

從中可以大概猜測(cè)在網(wǎng)站登錄頁面中存在如下SQL查詢語句:

            select * from accounts where FORUM_MEMBERS.M_NAME=’用戶名’ and
             FORUM_MEMBERS.M_PASSWORD=’密碼’

當(dāng)輸入上面的用戶名“admin”和密碼“a' or '1=1--”時(shí),SQL語句就變?yōu)椋?/p>

            select * from accounts where FORUM_MEMBERS.M_NAME=' admin' and
             FORUM_MEMBERS.M_PASSWORD=' a' or '1=1--'

SQL語句后Where部分的形式為“A=B AND C=D OR 1=1 ”,由于“1=1”是永遠(yuǎn)成立的,也就是說無論前面的“FORUM_MEMBERS.M_NAME=' admin' and FORUM_MEMBERS.M_PASSWORD=' a' ”是否成立,該條語句的返回值都為“真”,因此密碼驗(yàn)證的結(jié)果為通過,所以就能順利地登錄進(jìn)論壇了。

在實(shí)際的注入過程中,由于程序語言結(jié)構(gòu)不同,構(gòu)造的SQL注入語句可能會(huì)有相應(yīng)的變化,例如:

            ' or 1=1--
            " or 1=1--
            or 1=1--
            ' or ' a' =' a
            " or "a"="a
            ') or (' a' =' a

2.4.2 未過濾的request.form造成注入

“織夢(mèng)工作室企業(yè)全站程序(原良精)修正美化版Co Net Mib ver 1.0”是一套網(wǎng)上比較常見的整站網(wǎng)頁系統(tǒng),整體頁面簡(jiǎn)潔大方,功能齊全,添加和管理新聞日志、設(shè)置新欄目等都非常方便(見圖48)。

圖48 Co Net Mib ver 1.0

但是在該網(wǎng)站程序的后臺(tái)管理登錄頁面中,存在著一個(gè)典型的’'or'='or’漏洞。下面以此套程序?yàn)槔虼蠹以敿?xì)地分析其中的’'or'='or’漏洞原理、產(chǎn)生原因及其嚴(yán)重后果。

1.打亂次序,重組程序代碼

在“織夢(mèng)工作室企業(yè)全站程序(原良精)修正美化版”源代碼中,打開“manage”文件夾下的后臺(tái)登錄頁面文件“l(fā)ogin.asp”,在其中有如下一段代碼:

            <%
            pwd = request.form("pwd") "獲取客戶端輸入的密碼,再把值賦給pwd"
            name = request.form("name")  "獲取客戶端輸入的用戶名再把值賦給name
            "
            上面兩句都沒有對(duì)用戶輸入的數(shù)據(jù)進(jìn)行任何過濾
            Set rs = Server.CreateObject("ADODB.Connection") "利用 Server
            對(duì)象的CreateObject方法創(chuàng)建ADO組件的Connection對(duì)象"
            sql = "select * from Manage_User where UserName=' " & name & "'
             And PassWord=' "&encrypt(pwd)&"' "  "將用戶名和密碼放入查詢語句中查
            詢數(shù)據(jù)庫(kù)"
            Set rs = conn.Execute(sql) "執(zhí)行SQL語句"
            If Not rs.EOF = True Then  "當(dāng)前的記錄位于 Connection 對(duì)象的最記錄
            之后一個(gè)前"
            Session("Name") =  rs("UserName")  "將UserName的屬性賦給Name的
            Session自定義變量"
            Session("pwd") =  rs("PassWord")   "將PassWord的屬性賦給pwd的S
            ession自定義變量"
            Response.Redirect("Manage.asp")了  "利用Response對(duì)象的Redirect
            方法重定向"Manage.asp"
            Else
            Response.Redirect "Loginsb.asp? msg=您輸入了錯(cuò)誤的賬號(hào)或口令,請(qǐng)?jiān)?
            次輸入!"
            End If
            end if
            %>

從這段代碼中,我們已經(jīng)將語句功能進(jìn)行了注釋,可以看到后臺(tái)是采用“Session”驗(yàn)證的,其原理與采用“cookie”驗(yàn)證相似。從上面的源文件代碼分析中可以看到,后臺(tái)登錄沒有對(duì)客戶輸入的用戶名和密碼進(jìn)行任何過濾就交給了SQL語句查詢。如果查詢的記錄是位于最后一條記錄之前,也就是說用戶名和密碼查詢驗(yàn)證有效的話,則設(shè)置Session變量UserName、PassWord的值分別為Name、pwd,并重定向到“Manage.asp”。

通過以上分析,可以發(fā)現(xiàn)代碼中存在很大的安全漏洞,問題就出現(xiàn)在第1句和第2句。第1句和第2句代碼語句的功能是獲得客戶端輸入的用戶名和密碼,但是卻沒有對(duì)用戶輸入的數(shù)據(jù)進(jìn)行任何過濾,也沒有對(duì)用戶輸入的數(shù)據(jù)進(jìn)行檢查,從而導(dǎo)致就可以對(duì)其實(shí)行SQL注入攻擊。

要實(shí)行SQL注入漏洞攻擊,其問題的關(guān)鍵就是要使SQL語句的查詢結(jié)果為真,這里就要用到or和and的邏輯運(yùn)算的知識(shí)。這里簡(jiǎn)略地提一下邏輯運(yùn)算中的一些知識(shí)。

首先,and邏輯運(yùn)算符的意思是“且”,也就是對(duì)兩個(gè)表達(dá)式進(jìn)行邏輯“與”運(yùn)算;而or運(yùn)算符的意思是“或”,也就是對(duì)兩個(gè)表達(dá)式進(jìn)行邏輯“或”運(yùn)算。

下面是兩個(gè)運(yùn)算符的運(yùn)算結(jié)果:

and邏輯運(yùn)算的原則:真and真=真;假and真=假;真and假=假;假and假=假

or邏輯運(yùn)算的原則:真or真=真;假or真=真;真or假=真;假or假=假

如果and與or同時(shí)出現(xiàn),遵守一個(gè)優(yōu)先原則:

出現(xiàn)or同時(shí)又出現(xiàn)and時(shí),則先運(yùn)算and運(yùn)算符。

現(xiàn)在,先來看代碼中的SQL查詢語句:

            sql = "select * from Manage_User where UserName=' " & name & "'
             And PassWord=' "&encrypt(pwd)&"' "

要使這條語句執(zhí)行為真,就要構(gòu)造一個(gè)特殊的用戶名,以繞過程序的驗(yàn)證進(jìn)入后臺(tái)。我們只要在用戶名處輸入’or' ='or' ,密碼處隨便輸入字符,如輸入“admin”,這樣上面的SQL語句就變成了:

            sql = "select * from Manage_User where UserName=' 'or' =' or" An
            d PassWord=' admin'

那么where后的語句為:

            UserName=' 'or' =' or" And PassWord=' admin'

轉(zhuǎn)換成邏輯語句后,其形式為:

假or真or假and假

“假or真or假and假”邏輯運(yùn)算過程為:

假or真or假and假=假or真or(假and假)=假or真or假=(假or真)or假=真or假=真

通過簡(jiǎn)單的運(yùn)算,則最終結(jié)果為真,那么SQL語句的查詢結(jié)果也變成真了。如果這樣的語句看起來不怎么清楚,可以將用戶名換成另一條語句:

            1' or 1=1 or '1' ='1

那么SQL語句就變成了:

            sql = "select * from Manage_User where UserName='1' or1=1or'1'
            ='1' and PassWord='000' "

在邏輯表達(dá)式中’1’是為假,1=1為真,'1' ='1’也為真,而密碼是隨便輸入的,所以為假,那么where后的語句轉(zhuǎn)換成邏輯語句后為“假or真or真and假”,最終的運(yùn)算結(jié)果也為真。

2.'or'='or’控制了整個(gè)網(wǎng)站服務(wù)器

在“織夢(mèng)工作室企業(yè)全站程序(原良精)修正美化版”后臺(tái)登錄頁面中,我們就在用戶名處輸入’or' ='or' ,密碼隨便輸入(圖49),再單擊【登錄系統(tǒng)】按鈕,就可以直接進(jìn)入后臺(tái)管理頁面了(圖50)。

圖49 Co Net Mib ver 1.0后臺(tái)登錄頁面

圖50 成功登錄后臺(tái)

在網(wǎng)上有許多使用“織夢(mèng)工作室企業(yè)全站程序(原良精)修正美化版”的網(wǎng)站,只要在百度或Google中,以關(guān)鍵字“co net mib ver 1.0網(wǎng)站后臺(tái)管理系統(tǒng)”為關(guān)鍵字進(jìn)行搜索,就可以看到大量存在此漏洞的站點(diǎn)。

這個(gè)漏洞會(huì)造成什么樣嚴(yán)重的后果呢?

當(dāng)攻擊者利用’or'='or’漏洞進(jìn)入網(wǎng)站后臺(tái)管理頁面后,單擊頁面上方的“新聞管理”項(xiàng),進(jìn)入產(chǎn)品管理頁面后,再單擊“添加新聞”(圖51),將某個(gè)ASP木馬后綴名改為圖片的格式,在圖片上傳區(qū)域,單擊【瀏覽】按鈕,指定修改了后綴名的ASP木馬(圖52)。再單擊【上傳】按鈕,即可將木馬上傳到網(wǎng)站服務(wù)器上。

圖51 添加新聞

圖52 上傳ASP木馬圖片

從上傳返回信息中,可以得到ASP木馬文件上傳的路徑及文件名(圖53)。從“系統(tǒng)管理”→“上傳文件管理”中,也可以看到上傳文件的路徑。

圖53 返回上傳文件路徑

另外,還可以單擊上方新聞文字輸入框工具欄中的“插入圖片”按鈕,在彈出對(duì)話框中選擇上傳圖片(圖54)。上傳成功后,切換到“代碼”顯示方式,可看到插入圖片的源代碼為:

            <IMG src="/eWebEditor/UploadFile/200832213597875.jpg" border=0>

其中src后指定的就是圖片上傳后的路徑(圖55)。

圖54 直接插入上傳圖片

單擊“系統(tǒng)管理”→“數(shù)據(jù)庫(kù)備份”,在“當(dāng)前數(shù)據(jù)庫(kù)路徑”處填入ASP木馬的路徑,“備份數(shù)據(jù)庫(kù)目錄”可隨便設(shè)置某個(gè)已有的網(wǎng)站目錄路徑,在“備份數(shù)據(jù)庫(kù)名稱”處輸入一個(gè)asp后綴的文件名即可(見圖56)。單擊【確定】按鈕,通過數(shù)據(jù)庫(kù)備份功能,就可以將圖片改名保存為ASP木馬文件了。

圖55 查看上傳文件路徑

圖56 數(shù)據(jù)庫(kù)備份生成Webshell

直接在瀏覽器鏈接地址中輸入ASP木馬路徑,連接上ASP木馬后,就可以入侵控制整個(gè)網(wǎng)站服務(wù)器了,在這里我們上傳的是“砍客ASP木馬”(圖57)。當(dāng)然,上傳木馬后門還涉及到如何通過Webshell提權(quán)的問題,具體的入侵提權(quán)原理及方法將在后面提到。

從上面這個(gè)簡(jiǎn)單的例子可以看出,一個(gè)不起眼的’or'='or’漏洞是如何讓整個(gè)網(wǎng)站服務(wù)器被攻擊者控制于手中的。可見,網(wǎng)頁腳本安全與整個(gè)網(wǎng)站的安全緊密相聯(lián)。

圖57 Webshell控制網(wǎng)站服務(wù)器

主站蜘蛛池模板: 新津县| 临夏县| 绥棱县| 青阳县| 潞西市| 旅游| 胶州市| 凌云县| 河西区| 宿州市| 蒲城县| 五寨县| 武安市| 额敏县| 杭州市| 仙居县| 鹤峰县| 镇江市| 邹平县| 安阳县| 崇明县| 大丰市| 扬州市| 互助| 彭泽县| 甘南县| 枣强县| 清水县| 廉江市| 兴城市| 东乡族自治县| 闸北区| 桐庐县| 大化| 盐边县| 浦东新区| 宽城| 礼泉县| 玉山县| 碌曲县| 大埔区|