簡單實現二次注入

weixin_34292959發表於2016-09-22
 
測試程式碼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
 

 

相關文章