【sql注入】簡單實現二次注入


【sql注入】簡單實現二次注入

本文轉自:i春秋社區

 

測試代碼1:內容詳情頁面

[PHP]  純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
     include ( './connect.php' ); //引入數據庫配置文件
     $id = $_GET [ 'id' ];
     $select_sql = "SELECT * FROM article WHERE title='$id'" ;
     echo $select_sql ;
     mysql_query( 'set names utf8' );
     $select_sql_result =mysql_query( $select_sql );
     $date =mysql_fetch_assoc( $select_sql_result );
  ?>
  <!DOCTYPE html>
  <html>
    <head>
      <meta charset= "utf-8" >
      <title><?php echo $date [ 'title' ]. "啦啦啦啦啦啦" ?></title>
    </head>
    <body>
       <h1><?php echo $date [ 'title' ] ?></h1><br />
       作者:<?php echo $date [ 'author' ] ?><br/>
       時間:<?php echo date ( "Y-m-d H:i:s" , $date [ 'dateline' ])?><br />
       概述: <?php echo $date [ 'description' ]; ?><br />
       正文: <?php echo $date [ 'content' ] ?>
    </body>
  </html>


測試代碼2:內容添加頁面

[PHP]  純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?php
    include ( '../connect.php' );
    $title = addslashes ( $_POST [ 'title' ]);  //addslashes 將預定義字符串轉義
    $author = addslashes ( $_POST [ 'author' ]);
    $description = addslashes ( $_POST [ 'description' ]);
    $content = addslashes ( $_POST [ 'content' ]);
    $dataline =time();
    $insert = "INSERT INTO article(title,author,description,content,dateline) VALUES('$title','$author','$description','$content','$dataline')" ;
    echo $insert ;
    mysql_query( "set names utf8" ); //設置編碼
    if ( $result =mysql_query( $insert )){
      $num =mysql_affected_rows( $con );
      echo $num ;
      }
  ?>


首先我們簡單分析分析一下這兩段代碼。
測試代碼1是一個內容顯示頁面,通過傳入的title在數據庫進行查詢,然后在頁面調用輸出,我們可以看到傳遞的參數id並沒有經過過濾,可以成為一個典型的字符串GET注入,但是我們今天要討論的是二次注入,暫時不考慮這個注入。
測試代碼2是一個添加頁面,通過表單POST的數據執行INSERT語句插入數據,成功后返回數據庫影響行數,而且這里的每一個參數都用addslashes函數進行了轉義。
兩段代碼結合,我們可以發現一個典型的二次注入點,雖然文章添加頁面中過濾的非常嚴格,但是addslashes有一個特點就是雖然參數在過濾后會添加 “\” 進行轉義,但是“\”並不會插入到數據庫中,再配合內容顯示頁面中的查詢是通過title查詢的,所以我們就可以利用這個構造一個二次注入。
首先我們插入一條注入語句

 
可以看到我們的單引號已經被轉義,但是最后返回了一條“1”,證明我們的數據插入成功了,我們去數據庫看一下
 

可以看到 轉義用的“\”並沒有插入數據庫,但是我們的單引號還是成功插入了。我們來的主頁面。

 
看到了我們剛插入的數據,注意左下角的鏈接,可以看到ID的參數就是我們的注入語句。打開連接

 
發現成功返回了 user() database()。
簡單分析一下,當我們打開連接
http://127.0.0.1/CMS/article.show.php?id=1111'union%20select%20null,null,null,user(),database(),null'
URL中的ID被我們測試代碼1中 $id=$_GET['id']; 所獲取並帶入了sql語句查詢,最終執行的SQL語句為
SELECT * FROM article WHERE title='1111'union select null,null,null,user(),database(),null''
------------------------------------------------------------
修復的方法:最基本的就是在執行INSERT前判斷轉義后的字符是否存在“\'”如果存在就不執行INSERT。
其次在$id=GET['id']獲取參數時,進行過濾例如$id=addslashes($_GET['id']),這樣在獲取到的參數中也會被轉義無法執行

本文來源:http://bbs.ichunqiu.com/thread-11561-1-1.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM