本篇文章主要講解6個SQL的注入環境搭建,都是根據筆者練習時所記錄的代碼,搭建SQL注入環境的小夥伴可以根據這個內容進行練習。
01 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;//返回報錯信息
02 常規回顯注入
回顯注入類型是指我們的查詢內容會被應用回顯到頁面中;一般情況下回顯注入回利用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 nam
s 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; -- +
03 報錯注入
報錯注入類型是泛指應用頁面不返回內容數據,無法從回顯結果獲得信息;但是一般應用都會保留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); -- +
04 盲 注
盲注類型泛指無法利用回顯測試等情況,進行的一種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返回結果為第二類情況則適用時間盲注,通過時間延遲的方式來判斷布爾結果並不斷的猜解
*/
?>
1. 布爾盲注測試
' or left(database,2)='te'; -- +
2. 時間盲注測試
if(ascii(substr(database,1,1))='t',1,sleep(10)); -- +
05 寬字節注入
環境構造注意:該注入環境要求mysql資料庫採用GBK編碼;寬字節注入與HTML頁面編碼是無關的,即HTML頁面是UTF-8編碼,只要mysql是GBK都可以存在寬字節注入。
<?phpecho '<h1>';echo 'SQL寬字節注入環境';echo '</h1>';
$conn=mysqli_connect('127.0.0.1', 'root', 'root');// 連接mysqlif (!$conn){//判斷連接是否成功 echo '連接MySQL發生錯誤:'.mysqli_error($conn);}else{ echo '成功連接MySQL!';}echo '<hr>';// mysqli_select_db -- 查詢庫,or die(str) -- 上一個函數執行錯誤則輸出strmysqli_select_db($conn, 'text') or die ("無法正確連接到資料庫!");// mysqli_query -- 執行sql命令// set names utf-8 -- 寫入資料庫採用的編碼(utf-8)mysqli_query($conn, 'set names gbk');
// 接收參數textif(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>';}?>
06 登錄框注入
登錄框注入泛指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'; -- +
End.
作者:Mirror王宇陽
來源:博客園
零基礎入職數據分析就業班
課程的形式主要是「直播+錄播」
報名專享:課程項目作業+1v1班主任監督學習+愛數據學院學員專屬網站+班級答疑群
課程結束後能熟練掌握SQL、Python、Excel、PPT等工具
適合人群:
1.轉行(崗位相關,專業相關、對數據分析感興趣)
2.從事數據分析工作,但是需要提升技能以及增加實戰經驗
3.應屆畢業生入職數據分析