【sql注入】簡單實現二次注入
本文轉自:i春秋社區
測試代碼1:內容詳情頁面
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:內容添加頁面
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