审题
打开链接地址显示如下:
点击项目管理链接,转到目标网页
发现页面有一个view-source按钮(一开始没发现可以点击,打开源代码的时候发现,这是一个链接地址。)
view_source页面代码如下:
通过代码审计,发现session会话要有admin用户的信息,才可以进行文件上传的操作。
那么首先需要在session会话中获取admin用户的身份,通过下面的代码审计,发现可以利用id
这个参数。
admin身份绕过
首先看到此处的代码,想着能不能使用sql注入的方式绕过,sql注入没能成功。
冷静下,结合上面的代码,发现这个题的目的是获取admin用户信息后,上传shell文件。
id参数可以使用1*9进行绕过floatval(KaTeX parse error: Expected 'EOF', got '&' at position 19: …T[id]) !== '1' &̲& substr(_GET[id], -1) === ‘9’。floatval函数如下所示,可以自动过滤掉字符以及后面的数字。
substr($_GET[id], -1)函数获取id参数最后一个字符的值。
因此,可以通过构造id=1*9这样的参数进行判断绕过。
文件上传
获取到admin用户的身份后,就可以进行上传文件了。
*代表任意字符
查看文件上传处的代码,发现,上传文件通过post请求中的con以及file参数控制文件上传,con参数为上传文件的内容,file参数为上传文件的名称。而文件上传处是通过后缀名黑名单限制,因此需要参数file绕过文件后缀的正则匹配。
preg_match(’/.+.ph(p[3457]?|t|tml)$/i’, $filename)。此处正则匹配的内容为:
*.php、 *.php3、*.php4、*.php5、*.php7、*.pht、*.phtml。
文件名绕过的方法:*.php*(*.php\发现不能进行绕过除了文件名后缀,*.php\,猜测是因为‘\’转移字符的原因)
尝试使用php1、php2发现上传后,发现文件不解析,考虑.htaccess绕过的方法,文件上传后依旧不解析。最后只能考虑中间件解析的绕过方法。 经过测试以及百度发现’*.php\.'可以绕过。
参考