知识点: 1. php代码审计
2. php序列化字符串长度逃逸
开局进到这个页面,看着像sql注入,注入无果😅,不应该是sql注入吗_啊喂🙄.
扫一下他的目录吧~
有网站的源码,下载一下~
先看一下config.php.
出现了flag,可能后面会用到.
依次打开这些php文件,看看有什么敏感函数~
profile.php里有2处敏感函数.
update.php里有一处.
所以我们的思路就是通过file_get_contents()这个函数获取,config.php里的内容~
所以$profile['photo'] 这个内容就要为config.php
而$profile又是通过$user->show_profile($username)这个函数获得的
继续向前推~
$user这个对象在class.php里,是user的一个类.
这个对象调用的show_profile()这个function同时又继承了mysql类的filter方法和select方法.
filter 方法呢对 单引号 , \\ 进行替换为 下划线 , 其次又对 select , insert ... 替换为了 hacker
select 方法就是一个查询语句,并且返回第一行的结果.
那么我们就明白了,我们需要使查询的内容中对用的 photo 的内容为config.php.
profile.php的file_get_contents -> show_profile() -> class.php里的select() -> 数据库 -> class.php里的update() -> update_profile() -> update.php里调用传参。
既然知道了要查询到的内容,那么就找地方该插入数据了.
刚好有一个叫update.php 的文件
又指向了user类去看一下吧~
又调用了mysql类的update方法,去看一下~
是一个update的mysql语句~
再看一下我们插入数据经过下面代码处理
结果发现 photo 被md5 加密了, 我的天,那该怎么办?
于是我又盯上了photo前面的nickname, 由于我们传入的参数是经过序列化之后的,所以我们可以通过序列化的键值对逃逸来完成它.
再看一下update.php 对 nickname 有什么过滤的地方~
上面2个限制都可以通过数组来进行绕过~
我们就可以输入如下内容~
nickname[]=where";}s:5:"photo";s:10:"config.php";}
唉~
为什么构造的内容前面还有一个 " } " 呢?
因为我们加的是数组看下面这个实例就明白了.
那么,此时我们的数组长度为39除了 where 多了34 位,我们要想办法把那 34 位去掉,这个时候就用到了filter.
由于where为5 为 ,而他会被替换成hacker为6位,所以我们只需要添加34个where就可以变成34个hacker刚好多处34位~
开始构造payload~
wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}
开始实操,首先访问register.php 注册一个账户~
登录账户~
开始注入~
别忘了给nickname加上[].
点击Your Profile~
内容就是这个图片,用查看器看一下,由于进行了base64编码,还需要进行解码~
src="data:image/gif;base64,PD9waHAKJGNvbmZpZ1snaG9zdG5hbWUnXSA9ICcxMjcuMC4wLjEnOwokY29uZmlnWyd1c2VybmFtZSddID0gJ3Jvb3QnOwokY29uZmlnWydwYXNzd29yZCddID0gJ3F3ZXJ0eXVpb3AnOwokY29uZmlnWydkYXRhYmFzZSddID0gJ2NoYWxsZW5nZXMnOwokZmxhZyA9ICdmbGFnezUxYzY4MmE0LTRhODktNGJjMC1hOGM3LWMwMDY2YWEyYjdmOH0nOwo/Pgo="
解完之后出现flag~
求出flag,游戏结束~