mysql注入ctf CG CTF SQL注入

2021-10-17 22:43:02 字數 3441 閱讀 4397

sql注入1

題目訪問題目**

先檢視一下原始碼

仔細分析一下核心原始碼

if($_post[user] && $_post[pass]) //判斷結果集中的user引數對應的值是不是admin,如果是返回flag,不是則返回 you are not admin!

echo $query[user]; //回顯查詢到的user值

通過分析原始碼知道了user的值為admin,因為sql查詢語句裡有and,必須and前後同時成立才可以查詢,但是現在不知道pass對應的值,所以考慮能不能不判斷pass,直接判斷user,於是想到是不是可以將user判斷語句閉合並注釋後面的內容,這樣就不會對pass進行判斷,pass就直接輸入111,於是構造下面的語句。

這樣的話查詢語句就變成了

select user from ctf where (user='admin') #') and (pw='111')

嘗試提交看看會不會返回flag。

成功拿到flag

補充:mysql的注釋語句有三種

1./* */

注釋一段內容,這裡明顯不適用。

2.--

注釋-- 後的語句直到行尾,注意這裡的--後面要有乙個空格,但是題目中使用了trim()函式去除空格,所以也不適用。

3.#注釋#後的語句直到行尾。

sql注入2

題目

訪問題目**

還是先檢視一下原始碼

分析核心原始碼

if($_post[user] && $_post[pass]) ";

else ";

else {

echo("

log in failure!

");

解題思路:

1.可以看到這裡只對密碼進行了對比,沒有進行user的對比,所以應該考慮怎麼使得$query[pw]存在且strcasecmp($pass, $query[pw]))為假。

2.$query[pw]是mysql查詢結果集中的值,只要mysql語句返回值即可存在。

要使strcasecmp($pass, $query[pw])為假,就要使得$pass的值小於等於$query[pw](比較ascii碼)。$pass是我們輸入值的md5值,$query[pw]是資料庫中的正確密碼。因為$pass是md5值,32位,而$query[pw]不知道,所以看看能不能將$query[pw]的值構造成我們需要的32位,且大於$pass的值,根據題目的提示,考察union聯合查詢,嘗試構造如下語句:

select pw from ctf where user=''union select md5(2)#'

這個語句的輸出因為閉合了user,user為空,查不到任何值,而後面select md5(2),則會返回2的md5值,所以返回的結果會變成下面這樣:

| pw |

| c81e728d9d4c2f636f067f89cc14862c |

這樣從$query[pw]查詢到的值就會變成2的md5值,這時我密碼輸入2,這樣經過strcasecmp()函式的對比會返回0,達到目的。

成功拿到flag

補充:1.strcasecmp(str1,str2)函式

strcasecmp(str1,str2)函式返回的結果是比較兩個字串的ascii碼,從第一位開始,相等就比較下一位,如果比較過程中,一旦出現str1的某乙個字元的ascii碼和str2的不等,那麼將返回這兩個字元的ascii碼值之差。

2.union聯合查詢

當使用union聯合查詢時,前乙個select查詢的列名將會作為輸出結果的列名,後乙個select只會返回查詢列的內容,而沒有列名。

union前後查詢列名一致

mysql> select * from t2;

| id | score |

| 1 | 33 |

1 row in set (0.00 sec)

mysql> select * from t5;

| user | pw | id |

| admin | 000000 | null |

| admin2 | 1000000 | null |

| gubeiqing | gu | 10 |

3 rows in set (0.00 sec)

mysql> select id from t2 union select id from t5;

| id |

| 1 |

| null |

| 10 |

3 rows in set (0.00 sec)

union前後查詢列名不一致

mysql> select * from t2;

| id | score |

| 1 | 33 |

1 row in set (0.00 sec)

mysql> select * from t5;

| user | pw | id |

| admin | 000000 | null |

| admin2 | 1000000 | null |

| gubeiqing | gu | 10 |

3 rows in set (0.00 sec)

mysql> select id from t2 union select pw from t5;

| id |

| 1 |

| 000000 |

| 1000000 |

| gu |

4 rows in set (0.00 sec)

mysql 報錯注入語句 mysql注入

sql的注入型別有以下5種 boolean based blind sql injection 布林型注入 error based sql injection 報錯型注入 union query sql injection 可聯合查詢注入 stacked queries sql injection ...

mysql注入總結 mysql注入總結

4.相關函式 system user 系統使用者名稱 user 使用者名稱 current user 當前使用者名稱 session user 連線資料庫的使用者名稱 database 資料庫名 version mysql資料庫版本 load file mysql讀取本地檔案的函式 datadir ...

mysql 注入補丁 mysql手工注入總結

mysql的注入,關鍵是要找到注入點,對注入點進行處理,該閉合的引號,括號等要先進行閉合,然後注釋掉多餘的語句 一 稍微總結下幾種閉合方法 一般來說,程式設計師在書寫select語句時,會對傳入的變數進行一些處理,常見的有如下幾種,這裡以php為例,假設傳輸進來的變數為 id 其他後端語言也相同。s...