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

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

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

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

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

前面簡單地演示了一下漏洞攻擊的效果,但沒有講解其中的攻擊原理。下面我們詳細地向讀者介紹接觸一下’or'='or’注入的原理及方法。

2.4.1 'or'='or’攻擊突破登錄驗證的演示

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

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

用戶:admin’

密碼:123456

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

圖45 論壇登錄頁面

圖46 返回的錯誤信息

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

圖47 突破密碼驗證成功登錄

為什么不用輸入正確的密碼,都能夠登錄進入后臺呢?在剛才返回的錯誤信息中有如下語句:

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

從中可以大概猜測在網站登錄頁面中存在如下SQL查詢語句:

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

當輸入上面的用戶名“admin”和密碼“a' or '1=1--”時,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”是永遠成立的,也就是說無論前面的“FORUM_MEMBERS.M_NAME=' admin' and FORUM_MEMBERS.M_PASSWORD=' a' ”是否成立,該條語句的返回值都為“真”,因此密碼驗證的結果為通過,所以就能順利地登錄進論壇了。

在實際的注入過程中,由于程序語言結構不同,構造的SQL注入語句可能會有相應的變化,例如:

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

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

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

圖48 Co Net Mib ver 1.0

但是在該網站程序的后臺管理登錄頁面中,存在著一個典型的’'or'='or’漏洞。下面以此套程序為例,向大家詳細地分析其中的’'or'='or’漏洞原理、產生原因及其嚴重后果。

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

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

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

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

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

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

首先,and邏輯運算符的意思是“且”,也就是對兩個表達式進行邏輯“與”運算;而or運算符的意思是“或”,也就是對兩個表達式進行邏輯“或”運算。

下面是兩個運算符的運算結果:

and邏輯運算的原則:真and真=真;假and真=假;真and假=假;假and假=假

or邏輯運算的原則:真or真=真;假or真=真;真or假=真;假or假=假

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

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

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

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

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

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

那么where后的語句為:

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

轉換成邏輯語句后,其形式為:

假or真or假and假

“假or真or假and假”邏輯運算過程為:

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

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

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

那么SQL語句就變成了:

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

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

2.'or'='or’控制了整個網站服務器

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

圖49 Co Net Mib ver 1.0后臺登錄頁面

圖50 成功登錄后臺

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

這個漏洞會造成什么樣嚴重的后果呢?

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

圖51 添加新聞

圖52 上傳ASP木馬圖片

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

圖53 返回上傳文件路徑

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

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

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

圖54 直接插入上傳圖片

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

圖55 查看上傳文件路徑

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

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

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

圖57 Webshell控制網站服務器

主站蜘蛛池模板: 朝阳县| 铜梁县| 新干县| 滦南县| 和田市| 湖南省| 赤峰市| 西昌市| 土默特右旗| 阜新| 逊克县| 信宜市| 尉犁县| 新宾| 大方县| 崇左市| 耒阳市| 蒙山县| 镇雄县| 柳江县| 开化县| 弋阳县| 响水县| 斗六市| 丹寨县| 新昌县| 平塘县| 衢州市| 苍溪县| 宜兰县| 临湘市| 临沧市| 曲沃县| 克山县| 洛阳市| 长宁县| 济南市| 湖北省| 孙吴县| 乐至县| 汝州市|