1. 程式人生 > >sql注入中常見的報錯資訊

sql注入中常見的報錯資訊

sql注入是我們常見的ctf的web型別題目,因此我們在做這類題時經常會在頁面上返回錯誤資訊,因此熟悉一些常見的sql注入資訊是很重要的,下面我介紹一些自己常遇到的mysql報錯資訊。

我們在頁面上返回的錯誤資訊不僅僅只有mysql返回的,可能還有伺服器返回的,因此我僅僅對mysql返回的錯誤資訊進行總結

.

1,報錯資訊   The used SELECT statements have a different number of columns

這個報錯資訊經常出現在我們聯合查詢時,比如我給一個例子:

select * from tieba where id=100 union select 1,2,3,4,5,6,7 from tieba;

這便是一個聯合查詢的語句,出現錯誤的原因是我們在第一個查詢和第二個查詢裡的欄位數目不相等造成的,比如第一個查詢的語句只有三個返回欄位,而第二個查詢語句裡有七個返回欄位,這樣便會返回錯誤。

2,報錯資訊:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '';'' at line 1

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '''' at line 1

像這類的錯誤常常是我們沒有閉合引號或者小括號造成的。

我們可以使用聯合查詢來實現一些操作,現在我來說明一下union的使用方法。

union的作用便是將多個查詢語句的結果集合到一個集合當中,但是有一個限制條件,那便是查詢語句返回的欄位數要是一樣的,否則便會報錯。

因此我們可以利用union來進行sql注入操作,首先我們要確保第一個查詢語句的返回結果為空,這便返回的結果是我們所需要的了,還有一種便是當我們登陸時,便會有一個查詢的過程,因此我們可以利用構造聯合查詢語句來使我們的查詢有返回結果。

接下來講解一些關於sql注入的一些用法:

一些簡單的sql注入題型都會顯示出錯誤的資訊,因此我們可以通過錯誤資訊來了解sql的查詢語句。

常見的閉合方式有:單引號,雙引號,小括號等的混合使用,因此我們可以根據錯誤資訊構造一些自己想要的sql查詢語句

11‘ or 1=1#     11“ or 1=1#      11) or 1=1#    11’) or 1=1#     11”) or 1=1#  這個便是萬能密碼的語句,如果沒有經過檢查便會登陸

如果有顯示欄位,我們可以通過聯合查詢的方法來進行查詢自己想要的結果

聯合查詢的條件便是使前面一個的查詢語句不成功,然後便會顯示自己構造的查詢語句,還有便是將後面的語句給註釋掉用#

還要知道第一個查詢有多少個欄位,自己構造的查詢語句應該和第一個的查詢欄位數目相等,否則會報錯,開始構造語句之前還要知道前面的閉合方式,這個需要自己去檢驗。

eg:11” order by 3# 用來檢驗有多少個欄位,通過不斷改變後面的數字

eg:11“ union select 1,2,3# 用來檢驗回現欄位

eg:11“ union select database()# 查詢自己當前的資料庫名

eg:11" union select table_name from information_schema.tables where table_schema=database()#表示查詢當前資料庫的表

然後在columns這個資料庫裡查詢欄位名,然後在查詢資訊eg:select 欄位1,欄位2 from 表1#

以上總結的是有回顯欄位的查詢接下來講解沒有回顯欄位的查詢

我們需要構造一個子查詢,將自己的查詢語句放在子查詢語句裡,然後我們需要使用count(*)等函式,並且還要分組顯示,這樣便會將子查詢的結果以錯誤的方式顯示出來

eg:11” union select count(*),1,concat('---',(select table_name from information_schema.tables where table_schema=database() limit 1,1),'---',floor(rand()*2)) as a from information_schema.tables where table_schema=database()#

這邊是構造出來的語句。

當然我們通常遇到的sql注入題不會這麼簡單,通常有各種過濾的,有時會過濾單引號,雙引號,union等等

通常使用的過濾語句有:

mysql_real_escape_string() 函式轉義 SQL 語句中使用的字串中的特殊字元。

下列字元受影響:

  • \x00
  • \n
  • \r
  • \
  • '
  • "
  • \x1a

如果成功,則該函式返回被轉義的字串。如果失敗,則返回 false