常見的sql注入環境搭建

常見的sql注入環境搭建

By : Mirror王宇陽php

Time:2020-01-06html

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 ……mysql

<?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」等函數來查詢,可是沒法查詢到結果並會經過報錯的方式返回結果。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 ) 
	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注入測試方法。shell

盲注主要分爲兩種:數據庫

  • 布爾盲注:經過判斷頁面響應肯定是否正確的布爾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 '--+post

<!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'; -- +

相關文章
相關標籤/搜索