GET和POST的區(qū)別及get和post關(guān)于請求的編解碼的問題
GET請求中對MySQL的注釋:-- 铜靶,--+
POST請求對MySQL的注釋:-- 颜懊,#
注意:--后面必須跟空格敞斋,一般可以寫--空格+字母 如:-- k來進(jìn)行注釋
less 1 GET - Error based - Single quotes - String(基于錯誤的GET單引號字符型注入)
先id=1'丹墨,發(fā)現(xiàn)報(bào)錯
分析''1'' LIMIT 0,1'厕鹃,除去首尾兩個自動加上的單引號可以猜測出來是單引號閉合兢仰。
接下來是猜字段:
也可以用union來判斷select語句有幾個查詢字段
可為什么union 后面的select 1,2,3沒有出現(xiàn)其中的兩個數(shù)據(jù)
看一下源碼,可以看到函數(shù)mysql_fetch_array只被調(diào)用了一次剂碴,而mysql_fetch_array() 函數(shù)從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組把将,或數(shù)字?jǐn)?shù)組,或二者兼有忆矛,具體看你第二個參數(shù)是什么察蹲,所以這里無論怎么折騰最后只會出來第一行的查詢結(jié)果。
while ($row = mysql_fetch_array($result)) {
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
所以只要讓union前面的語句查詢結(jié)果為空,那么后面的select語句查詢的結(jié)果就會顯示出來漫拭。這個id他一般傳的是數(shù)字亚兄,而且一般都是從1開始自增的,我們可以把id值設(shè)為非正數(shù)(負(fù)數(shù)或0)采驻,浮點(diǎn)數(shù)审胚,字符型或字符串都行
下面就要開始真正查詢數(shù)據(jù)庫的信息了,可以看到只有第二列和第三列顯示在網(wǎng)頁上礼旅,所以我們只能用這兩個位置膳叨,但是兩個位置是不夠的。這時候需要用到數(shù)據(jù)庫的連接函數(shù)concat或者concat_ws其中concat_ws的第一個參數(shù)是連接字符串的分隔符痘系,還會用到group__concat(可以把查詢出來的多行連接起來)
concat和concat_ws()區(qū)別及MySQL的幾個實(shí)用字符串函數(shù)
user():返回當(dāng)前數(shù)據(jù)庫連接使用的用戶
database():返回當(dāng)前數(shù)據(jù)庫連接使用的數(shù)據(jù)庫
version():返回當(dāng)前數(shù)據(jù)庫的版本
(32是空格的十進(jìn)制ASCII懒鉴,58是:的十進(jìn)制ASCII。)
爆出了數(shù)據(jù)庫版本,數(shù)據(jù)庫名字和數(shù)據(jù)庫連接使用的用戶名临谱。
接下來爆數(shù)據(jù)表的名字
mysql的數(shù)據(jù)庫information_schema,他是系統(tǒng)數(shù)據(jù)庫抄课,安裝完就有唱星,記錄是當(dāng)前數(shù)據(jù)庫的數(shù)據(jù)庫,表跟磨,列间聊,用戶權(quán)限等信息,下面說一下常用的幾個表
SCHEMATA表:儲存mysql所有數(shù)據(jù)庫的基本信息抵拘,包括數(shù)據(jù)庫名哎榴,編碼類型路徑等,show databases的結(jié)果取之此表僵蛛。
TABLES表:儲存mysql中的表信息尚蝌,(當(dāng)然也有數(shù)據(jù)庫名這一列,這樣才能找到哪個數(shù)據(jù)庫有哪些表嘛)包括這個表是基本表還是系統(tǒng)表充尉,數(shù)據(jù)庫的引擎是什么飘言,表有多少行,創(chuàng)建時間驼侠,最后更新時間等姿鸿。show tables from schemaname的結(jié)果取之此表
COLUMNS表:提供了表中的列信息,(當(dāng)然也有數(shù)據(jù)庫名和表名稱這兩列)詳細(xì)表述了某張表的所有列以及每個列的信息倒源,包括該列是那個表中的第幾列苛预,列的數(shù)據(jù)類型,列的編碼類型相速,列的權(quán)限,獵德注釋等鲜锚。是show columns from schemaname.tablename的結(jié)果取之此表突诬。
Mysql數(shù)據(jù)庫information_schema系統(tǒng)表說明
有了users表名,接下來就要爆字段名芜繁,同理可以通過limit把所有的字段名枚舉出來旺隙,知道了有id,username骏令,password
less 2 GET - Error based - Intiger based (基于錯誤的GET整型注入)
讓id=1'
根據(jù)報(bào)錯可以知道這里是整型注入,變量沒有被字符包裹周拐。
所以這里不需要單引號铡俐,可以直接注釋后面的語句,剩余操作同lesson1
less 3 GET - Error based - Single quotes with twist string (基于錯誤的GET單引號變形字符型注入)
id=1'
根據(jù)報(bào)錯可以知道這里是('變量')妥粟,所以用')閉合审丘,后面注釋,其他同lesson1步驟即可勾给。
之后發(fā)現(xiàn)id=1"也是不會報(bào)錯的
可以用and 1=0 和1=1來判斷
less 4 GET - Error based - Double Quotes - String (基于錯誤的GET雙引號字符型注入)
直接上單引號,發(fā)現(xiàn)沒有報(bào)錯播急,這是因?yàn)閜hp中雙引號可以包含單引號,那么就讓id=1"
根據(jù)報(bào)錯可以知道這里是("變量")脓钾,所以")閉合,其他同lesson1步驟
less 5 GET - Double Injection - Single Quotes - String (雙注入GET單引號字符型注入)
id=1'
根據(jù)報(bào)錯可以知道這里是單引號閉合桩警,可是即使正常閉合也不會顯示數(shù)據(jù)
因?yàn)樵创a中根本就沒有輸出$row
很明顯正常是不能夠爆出來數(shù)據(jù)庫的內(nèi)容可训,所以就要通過報(bào)錯來顯示數(shù)據(jù)庫中的內(nèi)容。
有研究人員發(fā)現(xiàn)生真,當(dāng)在一個聚合函數(shù)沉噩,比如count函數(shù)后面如果使用分組語句就會把查詢的一部分以錯誤的形式顯示出來。(我發(fā)現(xiàn)如果沒有floor和rand函數(shù)也是不會報(bào)錯的)
less 6 GET - Double Injection - Double Quotes - String (雙注入GET雙引號字符型注入)
和less5一樣川蒙,只不過變成了雙引號閉合
查表
查列
查數(shù)據(jù)
less 7 GET - Dump into outfile - String (導(dǎo)出文件GET字符型注入)
導(dǎo)出到文件就是可以將查詢結(jié)果導(dǎo)出到一個文件中,如常見的將一句話木馬導(dǎo)出到一個php文件中
使用此漏洞需要知道WEB程序的根路徑并且MYSQL的secure-file-priv配置應(yīng)為可寫入該路徑
id=1
id=1'發(fā)現(xiàn)錯誤被屏蔽了
但是只有id=1')) and 1=0報(bào)錯,所以可以判斷出來是單引號加兩個括號閉合
為什么最后的結(jié)果在數(shù)據(jù)庫中不為空术瓮,是因?yàn)?a target="_blank" rel="nofollow">MySQL的隱式轉(zhuǎn)換
(http://www.jb51.net/article/101531.htm)**
@@datadir 讀取數(shù)據(jù)庫路徑
@@basedir MYSQL 獲取安裝路徑
這里可以通過在less1中獲取網(wǎng)站的路徑
然后就可以通過使用SELECT...INTO OUTFILE語句導(dǎo)出數(shù)據(jù)到文本文件上上傳一句話木馬
然后上菜刀
less 8 GET - Blind - Boolian Based - Single Quotes (布爾型單引號GET盲注)
id=1
id=1'
沒有任何提示康聂,因?yàn)樗彦e誤信息隱藏了,所以并不能用顯錯式注入胞四,只能用盲注恬汁。
詳解SQL盲注測試高級技巧
MySQL盲注的相關(guān)函數(shù):
length(str):返回str字符串的長度。
substr(str, pos, len):將str從pos位置開始截取len長度的字符進(jìn)行返回辜伟。注意這里的pos位置是從1開始的氓侧,不是數(shù)組的0開始
mid(str,pos,len):跟上面的一樣,截取字符串
ascii(str):返回字符串str的最左面字符的ASCII代碼值导狡。
ord(str):同上约巷,返回ascii碼
if(a,b,c) :a為條件,a為true旱捧,返回b独郎,否則返回c踩麦,如if(1>2,1,0),返回0
ascii(substr((select database()),1,1)):返回?cái)?shù)據(jù)庫名稱的第一個字母,轉(zhuǎn)化為ascii碼
if(ascii(substr((select database()),1,1))>64, 1, 0):ascii大于64就返回true,if就返回1氓癌,否則返回0
2分法猜數(shù)據(jù)庫名字
http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1)>64 %23 返回正確谓谦,大于64
http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))>96 %23 返回正確,大于96
http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))<123 %23 返回正確顽铸,小于123 茁计,區(qū)間在97-122
http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))>109 %23 返回正確,大于109谓松,區(qū)間在110-122
http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))>116 %23 返回錯誤星压,所以在110-116之間
http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))>112 %23 返回正確,大于112鬼譬,區(qū)間在113-116之間
http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))>114 %23 返回正確娜膘,大于114,間在115-116之間
http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))>115 %23 返回錯誤优质,不大于115竣贪,即第一個字母的ascii為115,即字母s
盲注一般是寫腳本或者使用工具輔助巩螃,否則手動盲注需要大量時間
less 9 GET - Blind - Time based. - Single Quotes (基于時間的GET單引號盲注)
無論正確還是錯誤他都只會顯示you are in......所以只能用基于時間的盲注
只有單引號閉合的時候演怎,他才會延遲5秒。所以可以判斷出來這里是單引號閉合避乏。
然后同less 8的盲注爷耀,
less 10 GET - Blind - Time based - double quotes (基于時間的雙引號盲注)
這道題跟less 9一摸一樣,只不過是單引號閉合變?yōu)殡p引號閉合
less11 POST - Error Based - Single quotes- String (基于錯誤的POST型單引號字符型注入)
查看元素可以知道兩個POST分別是uname和passwd。
首先uname=1'&passwd=2,報(bào)錯
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2' LIMIT 0,1' at line 1
**發(fā)現(xiàn)1沒有報(bào)錯爹橱,2為什么兩邊只有一個單引號萨螺,看源碼
應(yīng)該是加進(jìn)去的單引號跟前面的單引號閉合,剩余的單引號與password前面的單引號閉合愧驱,最后剩余了password后面的單引號慰技。
加個or 1=1 -- k發(fā)現(xiàn)登陸成功
或者在passwd后面加單引號報(bào)錯
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''2'' LIMIT 0,1' at line 1
可以發(fā)現(xiàn)是單引號閉合,然后直接or 1=1 -- k發(fā)現(xiàn)登陸成功如果是uname=1' or '1'='1&passwd=2冯键,在源代碼中顯示正常
因?yàn)閍nd的優(yōu)先級高于or 【就是and先運(yùn)算】庸汗, '1'='1' and password='2' 先運(yùn)算右邊的password='2'在數(shù)據(jù)表中不存在惫确,所以右邊是false,那么整個and就是false。然后計(jì)算uname='1' or false 改化,而兩邊都是false所以最后的結(jié)果就是false掩蛤。
那么就uname=1&passwd=2' or '1'='1在源碼中
先計(jì)算uname='1' and password='2'結(jié)果是false,然后計(jì)算false or 1=1陈肛,右邊是true揍鸟,那么整個or就是true。
這里也可以通過盲注獲取信息
less 12 POST - Error Based - Double quotes- String-with twist (基于錯誤的雙引號POST型字符型變形的注入)
雙引號報(bào)錯less 13 POST - Double Injection - Single quotes- String -twist (POST單引號變形雙注入)
單引號報(bào)錯查表
其余操作前面有不再細(xì)說。
less 14 POST - Double Injection - Single quotes- String -twist (POST單引號變形雙注入)
變?yōu)殡p引號閉合谈撒,操作同less 13less 15 POST - Blind- Boolian/time Based - Single quotes (基于bool型/時間延遲單引號POST型盲注)
錯誤信息被隱藏了腥泥,所以只能用盲注。說明是單引號閉合
數(shù)據(jù)庫名長度為8
數(shù)據(jù)庫名第一個字母ASCII為115
二分法加limit得到所有數(shù)據(jù)表名字
同理可得到字段名啃匿,以及數(shù)據(jù)蛔外。
如果我插入uname=1&passwd=2' or sleep(5) -- k會延遲1分多最后什么也沒有顯示。在cmd中返回為空
原來是false or sleep(5)最后返回為0,最后就什么也查不到溯乒。
and與or的截?cái)嘈?/h4>
在SQL語句中如果and前面為false那么后面的語句就不會執(zhí)行夹厌。
如果or前面為true那么后面的語句就不會執(zhí)行。
less 16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/時間延遲的雙引號POST型盲注)
同15裆悄,這里用時間延遲盲注
其他把length函數(shù)換成select的操作同less 7
less 17 POST - Update Query- Error Based - String (基于錯誤的更新查詢POST注入)
注意:下面的注入,一不小心可能把數(shù)據(jù)庫的user表的密碼表給清空了
第一個參數(shù)是 目標(biāo)xml
第二個參數(shù)是 xpath的表達(dá)式灯帮,這個看w3c那個xpath教程
第三個參數(shù)是 要將xpath的表達(dá)式的東西將目標(biāo)xml替換成什么
function check_input($value)
{
if(!empty($value))
{
$value = substr($value,0,15);
}
// // 去除斜杠
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// 如果不是數(shù)字則加引號并轉(zhuǎn)義
if (!ctype_digit($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
}
else
{
//是數(shù)字也要用intval轉(zhuǎn)化成int崖技,因?yàn)閭鬟^來的是字符型數(shù)字
$value = intval($value);
}
return $value;
}
check_input函數(shù)首先判斷如果不為空,就截取前15個字符钟哥。
當(dāng)magic_quotes_gpc=On的時候迎献,函數(shù)get_magic_quotes_gpc()就會返回1
當(dāng)magic_quotes_gpc=Off的時候,函數(shù)get_magic_quotes_gpc()就會返回0
magic_quotes_gpc函數(shù)
addslashes函數(shù)
stripslashes函數(shù)
ctype_digit函數(shù)
mysql_real_escape_string函數(shù)
首先通過用戶名找到用戶名和密碼腻贰,接著更新那個用戶名的密碼為新輸入的密碼吁恍。
首先要繞過通過用戶名查詢出用戶名和密碼,這個我們只能猜吧播演,比如admin冀瓦,root,test什么的写烤,這個可以用字典在這里我們就當(dāng)知道是admin了翼闽,直接用admin就考慮下一步
查表
查列
查數(shù)據(jù)
less 18 POST - Header Injection - Uagent field - Error based (基于錯誤的用戶代理感局,頭部POST注入)
這里對用戶名和密碼都加了過濾
正常登陸后顯示User Agent
less 19 POST - Header Injection - Referer field - Error based (基于頭部的Referer POST報(bào)錯注入)
正常登陸后顯示的是
Your IP ADDRESS is: 127.0.0.1
Your Referer is: http://127.0.0.1/sqli-labs-master/Less-18/
抓包改包询微,referer后加個單引號
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '127.0.0.1')' at line 1
可以猜測閉合方式為('變量','變量')也可以用updatexml
還有另一個報(bào)錯函數(shù)extractvalue
第一個參數(shù)也是個xml崖瞭,第二個參數(shù)就是xpath的表達(dá)式,這個函數(shù)是獲取xml中某個節(jié)點(diǎn)的值
less 20 POST - Cookie injections - Uagent field - Error based (基于錯誤的cookie頭部POST注入)
兩種方式
然后就可以用concat函數(shù)獲得數(shù)據(jù)书聚。
2.已經(jīng)登陸并且有了cookie
less 21 Cookie Injection- Error Based- complex - string ( 基于錯誤的復(fù)雜的字符型Cookie注入)
抓包發(fā)現(xiàn)cookie經(jīng)過了base64編碼
對admin'進(jìn)行base64編碼并發(fā)送過去發(fā)現(xiàn)報(bào)錯信息
對SQL語句進(jìn)行BASE64編碼并發(fā)送