WEB绕过类
#绕过积累:
#eval执行命令型:
一.
前置条件:
if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd))if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd))eval($cmd);禁止: 大写字母 A-Z、小写字母 a-o 和 q-z、数字 0-9、符号 $
禁止: 大部分常见的特殊符号。
留下: 小写字母 p、 .(点)、/(斜杠)、;(分号)、?(问号)、>、<、=、\(反斜杠)、|(管道符)以及 ```(反引号)。
方法1:Linux 的 . (source) 命令
在 Linux 中,. filename 等同于 source filename,可以执行文件中的内容(即使文件没有执行权限)。
过程拆解:
首先post一个由我们自己构造好的含有恶意命令的文件到服务器上去,然后通过 . (source) 匹配到这个文件,然后执行文件中的命令,而不是单纯依靠eval来执行。
这里有运用到一个php的特性:当你向一个 PHP 页面发送一个 POST 请求 且包含文件上传时,无论 PHP 代码里有没有处理上传的逻辑,PHP 引擎都会:
- 接收这个文件。
- 把它保存在服务器的临时目录下(通常是
/tmp)。 - 给它起一个随机名字,比如
phpXXXXXX。
#php常见的绕过方式:
1.
isset($_GET['syc']) && preg_match('/^Welcome to GEEK 2023!$/i', $_GET['syc']) && $_GET['syc'] !== 'Welcome to GEEK 2023!'把这段分成四个部分。
第一个部分要求传入数据给参数syc,get方法,且必须传入数据。
preg_match将我们传入给参数syc的数据跟前面的字符串作比较,/...../ 内表示正则表达,^ 表示开始,$ 表示结束,i:忽略大小写。
后面的又要求我们传入的数据不能完全等于Welcome to GEEK 2023!。
因为前面的虽然要求我们等,但可以大小写不同,所以只要改一个字母就行了。
2.类型转化
intval($_GET['lover']) < 2023 && intval($_GET['lover'] + 1) > 2024intval() 在解析字符串时,会从左往右读取,直到遇到第一个非数字字符为止。
比如:intval("1e10") 会返回 1
PHP 使用 + 运算符处理字符串和数字时,它会尝试将字符串转换为数值(float 或 int)。同时它也能识别科学计数法。
所以我们如果传入1e10,这样前面的读取数值只到1,而后面的加法得到的实际数字为1*10^10+1,当然大于2024了。
3.转化类型时的强比较哈希
if (isset($_POST['qw']) && $_POST['yxx']) { $array1 = (string)$_POST['qw']; $array2 = (string)$_POST['yxx']; if (sha1($array1) === sha1($array2))POST方法传数据给两个参数qw和yxx,又用string将我们的数据强制转化成字符串的类型,后面又强制比较两者的哈希值必须完全一样,
因为string在将数组转化为字符串时,统一转化为Array,如果两个参数都是数组,那转化的字符串就一样了,哈希值当然就一样了。
qw[]=1&yxx[]=2
4.
if (isset($_POST['SYC_GEEK.2023'])&&($_POST['SYC_GEEK.2023']="Happy to see you!")) { echo $flag;这边有些鸡贼,因为实际上后面是赋值没有作用,要看起那么的issert,我们需要对这个参数传入任意数据。
可以在 PHP 中如果我们填写的参数中存在 . 这个符号时,在实际上会被强制转化为_,比如如果我们写的是 1.2A=1 实际操作上会变成 1_2A=1。
但是又存在 如果参数名中出现 [,PHP 会将其替换为 _,但之后其它的字符(如点号)将不再被替换。这样的机制,因此我们就可以利用。
比如 SYC[GEEK.2023=1。
#php反序化绕过
(preg_match('/[oc]:\d+:/i',$cmd))oc匹配我们的对象。
| O | Object | O:8:"MyClass":... | 最常见的普通类对象。 |
|---|---|---|---|
| C | Custom Object | C:11:"ArrayObject":... | 实现了 Serializable 接口的类。 |
:\d+:匹配我们的xxx
因此 这个 主要是拦截 O:xxx:xxx 和 C:xxx:xxx
可以利用正则不识别+,或者还可以利用数组。
- 版权声明:本文由 余林阳 创作,转载请注明出处。
喜欢这篇文章吗?
点击右侧按钮为文章点赞,让更多人看到!
在下余林阳