ps:本人小白,目前处于刚学习的阶段,所以有错误的地方请各位大佬指出
通过正则搜索相关的函数,发现了三处存在危险函数,通过审计发现第一个是一个不可控制的变量,发现第二个或许是可以控制的变量,因此查看第二个
打开该代码,header("Content-type:image/jpeg");是以图片的方式打开该网页
file_get_contents函数的意义又是将整个文件读入一个字符串,同时又用echo进行了输出,接着我们查看$_SESSION[‘avatar’],往上下文查看是否可以控制,但发现该页当中没有
我们先把header("Content-type:image/jpeg");注销查看该网页,发现全是乱码
而正常引用的话,则是用户头像
于是,我们再用工具中的搜索功能进行搜索,$_SESSION['avatar'],同时需要先把正则关闭,然后搜索出多处含有$_SESSION['avatar'的地方,第一处是我们上面查找的地方,因此掠过
查看第二处,发现只有一个我们要搜索的$_SESSION['avatar'],并不可以控制
第三处,是登陆页面,是从数据库获取$_SESSION['avatar']
下面查看第四处,发现$_SESSION['avatar'] = $avatar;,再去向上查看$avatar,发现是写死的,因此也不可控制
1、下面我们打开第五处,$_SESSION['avatar'] = $avatar;
2、然后我们再去往上查找$avatar,$avatar = $uploaddir . '/u_'. time(). '_' . $_FILES['upfile']['name'];虽然前面拼接了很多东西,但是不要紧
3、发现可以控制的$_FILES['upfile']['name'],上传文件的源文件名,这个是我们可以控制的
同时发现,$avatar是要修改到数据库当中的,虽然下面依然是上面的修改之前的那个$_SESSION['avatar'],但是如果结合上面的代码,重新登陆就是从数据库中获取,因此该案例可能存在一个二次注入+任意文件包含命令
因此,我们要让修改头像的sql语句中的$avatar,变成我们要包含的文件
于是我们重新构造sql语句,先闭合user_avatar,然后在重新赋值,所以我们要传入的数据要',user_avatar = '../sys/config.php'
下面我们先来查看一下数据库中存储的avatar,发现是一个正常的图片
然后我们通过burp抓包修改一下文件名,把文件名修改成我们所需要包含的php,放包发现只允许上传图片格式,是个白名单
因此我们在打开源代码,进行所有回显的jpg png gif,查看该两处的源代码,发现是白名单,因此要想办法截断注释,在通过的验证的时候,又不让图片格式的后缀到sql语句中不执行
这个时候,我们利用sql语句中的注释号#,在sql语句中并不起作用,于是我们修改语句为',user_avatar = '../sys/config.php'#.jpg重新进行上传
上传成功,紧接着我们来查看数据库的储存的图片,全部变为php文件,虽然储存了,但是没有按照预想存储我们的../sys/config.php,
根据回显的,它并没有把我们输入的文件名当作一个整体来执行
是以最后一个/作为文件名
因此我们通过16进制编码,把我的文件名作为一个整体进行输入,结果可以成功输入我们预想的文件名
下面我们退出重新登陆,然后查看头像
通过正常的访问图片,我们无法进行访问,根据上面的代码,咱们知道没有办法显示是因为上面代码中规定了本页面使用图片格式阅读
于是我们来进行burp抓包,通过工具来进行查看,拿到源代码,可以看到数据库的配置