本文來源:i春秋社群-分享你的技術,為安全加點溫度
測試程式碼1:內容詳情頁面
測試程式碼2:內容新增頁面
首先我們簡單分析分析一下這兩段程式碼。
測試程式碼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']),這樣在獲取到的引數中也會被轉義無法執行
[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