RCE之无字母数字RCE
无字母数字RCE,就是在字母和数字都被过滤的情况下构造出webshell,进而达到命令执行的目的。
通常,过滤的语句大致写法:
12345678<?php $command = $_GET['w']; if (preg_match("/[A-Za-z0-9]+/", $command)){ die(); } else { eval($command); }?>
其中,正则还可以写成
1if(preg_match('/^\W+$/', $command))
/^\W+$/中的\W 是一个预定义的字符类,表示 非单词字符,相对的\w表示单词字符。
单词字符(\w):
大小写字母 (a-z, A-Z)
数字 (0-9)
下划线 (_)
非单词字符(\W)是上面以外的任何字符,例如:
标点符号(如 !, @, #)
空格、换行符
其他非字母数字的字符
用运算符实现先上一下表
1、 异或运算符^
两个字符异或操作后,会得到一个新的字符,例如:
h和[进行异或操作,得到 ...
RCE之常见绕过方式
对一些常见的绕过方式进行总结
过滤了特定关键字
通配符。使用通配符?或*绕过对一些关键字的过滤
使用引号,例如flag.php,写为fl’’ag.php, echo `cat fla’’g.php`, l’’s, l””s
利用转意符号:l\s
利用斜杠:l/s
利用${Z}, $*:l${Z}s、l$*s
过滤了cat替代命令:tac、more、less、head、tail、nl、od
过滤了system函数
使用passthru()替换system()
使用shell_exec()、exec(),不会打印结果,需配合echo
使用反引号``,但是反引号的结果不会主动输出,需要使用echo命令输出执行结果,echo `ls`
过滤空格
%09(tab)
%20(空格本身的url编码)
%0a
${IFS}(Linux),eg:cat${IFS}flag.txt
$IFS$9(Linux),eg:cat$IFS$9flag.txt
<>、<,eg:cat<>flag.txt、cat<flag.txt
{},eg: ...
CVE-2024-9047复现及成因分析
CVE-2024-9047复现及成因分析第一次从源码层面逐步分析一个cve,头秃,但好在捋出来了,写得不好,望各位师傅见谅。
CVE-2024-9047 是一个影响 WordPress 插件 wp-file-upload 的严重漏洞,允许攻击者在前台读取和删除任意文件。漏洞存在于插件版本 <= 4.24.11 中的 wfu_file_downloader.php 文件中。攻击者可以通过构造特定的请求,利用 fopen 函数读取服务器上的敏感文件。
版本:<= 4.24.11
Fofa指纹:body=”wp-content/plugins/wp-file-upload”
成因分析安装了WordPress File Upload插件的系统,在其wp-content/plugins/wp-file-upload目录下的wfu_file_downloader.php 中调用了 wfu_fopen_for_downloader 方法:
12345678910111213141516171819202122function wfu_ ...
大模型提示词---Prompt Engineering(提示工程)
大语言模型相信现在大家都是用的非常多,但为了能够更准确、更匹配的得到我们想要的,就需要我们提供一些提示词给模型,例如平常互联网上整活时给模型发的,“假设你是我对象,请你用哄对象的语气和我说话,并且每次说完之后都要说一次mua~”。
提示词工程(Prompt Engineering)是指在与人工智能模型(尤其是语言模型)交互时,通过精心设计和优化输入的提示(prompt),以引导模型生成所需的输出。其目的是通过明确、结构化的语言指令、问题或任务描述,最大程度地提高模型生成内容的准确性、相关性和有效性。输入的提示词可以是一个问题、一个描述、一组关键词或上下文信息,用来告知模型我们希望得到的输出类型和内容。
提示词是一门经验科学,通常是基于启发式的,想要写出一段好的提示词需要很多很多次的测试来发现最好的提示词,而且能生产更有效的内容 。
为什么需要Prompt当前大语言模型(LLM)本身已经具备了极高的性能与复杂性,但是通过精心设计的Prompt可以协助挖掘其中的潜力,引导模型生成特定需求的输出。调整Prompt的过程,就是在改变我们和模型交流的语言和方式,并且这一调整的过程不需要我们调整 ...
参数化查询对SQL注入的防护思考---曾经自信的误判
写在前面记得大三的时候,有一门web开发的课程,当时的大作业就是开发一个系统,并且可以自行在其中做上一些安全防护。由于需要实现用户注册、登录、查询等等一系列需要与数据库进行交互的功能,防止SQL注入是很有必要的。当时经过在网上的一顿学习,发现使用PDO参数化查询可以有效防止SQL注入的呼声最高,于是自信满满地大作业里的所有与数据库进行交互了的位置都替换成了参数化查询的方式,并且答辩的时候向老师一顿鼓吹。
直到前两日,xsheep师傅突然在群里聊到之前尝试挖洞的一个站,通过一个注入点进行报错注入,已经通过database()和user()拿到了回显的情况下,想要再进一步,爆出表名等信息时出现了问题。
拿到了师傅分享的链接后,我也尝试了半天,确实一直没办法进一步利用,一直重复出现的都是那几个报错,甚至让我一度怀疑我的payload编写的问题。后来了解到,在特定情况下,PDO的预编译,好像真没法完全阻止我们注入的SQL语句。
参数化查询参数化查询是用于数据库操作的一种方法,能够在一定程度上防止SQL注入,其核心主要是预编译和绑定参数。
预编译:SQL语句和参数分离,数据库先对SQL语句模版进 ...
逆向学习(3)---IDA的使用和实践
IDA作为一款强大的反汇编工具,能够将程序的二进制代码转换成可读的汇编代码,帮助我们在静态分析的过程中更加直观的看到程序的运行机制。
导入文件的过程和界面打开IDA后的界面如下图,根据提示打开想要分析的文件即可,此处先使用前面编写的输出Hello World!的程序进行分析。
打开后,界面如下:
图形界面:
在该界面下使用空格键,可以切换到本文内容:
IDA打开后,默认的为反汇编窗口:
十六进制窗口:
导入表,双击可以查看引用:
导出表,同理可以双击导出表函数,定位代码:
以上为常用到的内容,IDA功能实在过多,后续使用到现场学习。
生成伪代码在IDA中,按F5可以讲当前反汇编的内容转换为伪代码,以提高可读性。
以下是我的程序的伪代码,可以看出,因为程序功能较为简单,生成的伪代码准确率还是很高的:
实践尝试题目:Jarvis-stheasy
使用IDA打开题目附件
F5查看伪代码:
进入main函数
在main函数里可以看到,这个程序主要点在于if语句,那么再深入看看su b_8048630函数
输入参数为s,从上一层可以看出s就是flag,第一个if表示fl ...
HTTP API授权认证:服务器的灵魂三问——你是谁?你要干啥?你能干啥?
最近在工作里看了蛮多流量,有一天突然注意到http的请求头内容里的Authorization头,看到时突然有种既熟悉又好像有哪里不对的感觉,仔细看了下单词拼写才发现和之前经常见到的身份认证头Authentication不同,先前比较熟悉的还是身份认证(Authentication)中的Basic、JWT等,并且最近挖SRC的过程中看到很多认证方式,遇到了也只能挑熟悉的下手。于是起了兴趣研究一下HTTP中的认证方式,本文主要从理论内容上浅析一下HTTP API中的授权认证(纸上谈兵版)。
引言众所周知,HTTP协议是无状态的,也就是其对于事物处理没有记忆能力,服务器不知道客户端是什么状态,当客户端給服务器发送http请求后,服务器根据请求将响应数据发送回来后就不会记录其他信息,即使是使用Keep-Alive也没办法改变此类结果。因此,在我们需要获得用户是否登录的状态时,就需要·检查用户的登录状态。通常用户成功登录后,服务器会为用户分配一个登录凭证(Token),这个登录凭证一般又会有两种存放形式,一是以Cookie的方式存储在客户端,另外一种则是以Session的方式存储在服务器端,在客 ...
逆向学习(2)---分析实践
刚学习编程时,是从C语言的HelloWorld开始的,那么此处就也从HelloWorld开始分析吧,其中引出了C语言中的调用约定的学习。
还是那个Hello World使用C编写一个输出HelloWorld的简单程序:
12345#include<stdio.h>int main() { printf("Hello, World!\n");}
将其打包为一个可执行程序,并使用IDA打开:
可以看到IDA将程序中的机器码转换为了汇编语言的形式。
在IDA显示的内容中,发现除了接触过的汇编语言以外,还存在:
1; int __fastcall main(int argc, const char **argv, const char **envp)
递归学习一下
C语言的调用约定(Calling Convention)在C语言中,有不同的调用约定,用来定义函数如何调用、参数如何传递以及栈的清理方式。它们的主要区别如下:
__cdecl(C Declaration)特点:
C的默认约定。
参数从右到左依次压入栈。
返回值通常存储 ...
逆向学习(1)---基础知识
所谓技多不压身,最近准备抽空学习一些逆向的内容,在拓宽自己的安全知识的同时也多尝试一些新的领域。
基础概念1. 什么是逆向工程在编写代码时,我们的目标是将源代码转换为可执行程序,而逆向工程,顾名思义,就是将编译链接好的程序反过来恢复到“代码级别”的内容。这里的“代码级别”指的是程序逻辑的表述形式,而不是完全还原到源代码。原因在于,源代码的编译过程是不可逆的,我们无法从编译后的程序中完全恢复出原始源代码。
逆向工程通常需要借助工具对程序进行反编译,将二进制文件转化为汇编代码,有时甚至可以进一步恢复成更高级的伪代码。
像日常用到的一些C\C++程序在经过编译和链接后,程序为机器码,从而可以直接被执行程序的CPU等理解与使用。这类程序我们使用IDA、OD等逆向工具,只能将其中的机器码恢复为汇编代码状态,然后通过读汇编代码来理解程序的运行过程与机制。相比这一类编译运行类的程序,依靠java虚拟机、.NET等运行的程序,由于所生成的字节码(供虚拟机解释运行)仍然具有高度抽象性,所以这类程序的逆向得到的伪代码的可读性更强,有时甚至接近于源码。但是在生成字节码的过程中,变量名、函数名是丢失的,所以伪 ...
SSRF服务端请求伪造攻击
一直准备把之前在CSDN写的内容都翻新一下重新搬运到现在的博客下,今天偶然遇到了一个可能存在SSRF的漏洞点,但是很多细节一瞬间没办法想起来了,正好趁现在来整理整理。
简介服务端请求伪造(Server Side Request Forgery, SSRF),是一种攻击者在不具有服务器权限的情况下,利用服务器的漏洞来伪装成服务器发起请求的攻击。由于此时请求是由服务器发起的,所以在一般情况下,SSRF攻击的目标一般为外网无法正常访问的内部系统。
简单来说:利用一个可向外发起请求的服务器当作跳板访问其他服务。
SSRF漏洞分类根据是否回显可以划分为3类:
Basic SSRF:在响应内容中返回结果。例如,传送一个网址,会直接返回这个网址的界面或对应的html内容。
Blind SSRF:响应中不返回服务器中的任何信息。
Semi SSRF:响应中不返回请求结果的所有详细信息,但是会暴露一些数据信息。
常见参数(测试时可额外留意)share、wap、url、link、src、source、target、u、3h、display、sourceURL、imageURL、domain、……
SS ...
