代码审计
Bugku
1.decrypt
进入场景 下载看到源代码
通过审计
密钥为 $key 之位MD5加密’ISCC '后的 729623334f0aa2784a1599fd374c120d
$char 为32为密钥循环拼接。
最后加密方法为加密方法 将data和密钥的每一位ascii值相加后除以128得余数 的值 再 返回为字符串 拼接起来
找个脚本
<?php
$key = md5('ISCC');
$x = 0;
$base64_str = 'fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=';
$data = base64_decode($base64_str);
$len = strlen($data);
$char = '';
$str = '';
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr(ord($data[$i]) - ord($char[$i]));
print($str."\n");
}
?>
跑出来了
2. 各种绕过哟
进入场景
通过简单审计发现要只要使uname的sha1的值与passwd的sha1的值相等即可,但是同时他们两个的值又不能相并且发送passwd[]=2 的 postdata 请求即可
需要构造http://120.24.86.145:8002/web7/?uname[]=1&id=margin 并发送 passwd[]=2 的 postdata 请求即可得到flag
3. 闪电十六鞭
简单审计要get上传要符合字符长度 $hack=mlag;$hack{0}=f;111111111111;?><?=$$hack;?>
得到flag
4. file_get_contents
简单审计需要ac=f出flag 还有file_get_contents()绕过用php:filter-php://data-file://
找ac评论区说有个flag.txt文件访问得到bugku
现在直接构造ac=f
Payload;?ac=bugku&f=flag.txt得到flag
另一种思路
5. No one knows regex better than me
简单审计
1.本题主要使用的是preg_match_all()函数匹配,其中只要我们在变量second中含有Yeedo,wants,a,girl,friend,or,a,flag等字符就可以匹配成功
2.传入的参数中不要有flag或两个连续的点(…)时,即可跳出匹配,这两里的话输入单个点的话,会被转义
3. 两个反斜杠(\),而php在解析字符串的过程中,会把两个反斜杠(\)转换成一个(),所以这里的管道符(|)没有被解析,就会和后面的编码组合成被匹配的对象
在Php和Python中的编码中
(\+数字)-------->属于八进制编码
(\x+数字)------->属于十六进制编码
构造:/?zero=ZmxhZw==&first=aaaa|.php得到flag
6.变量1
简单审计要用get方式上传srgs匹配正则 但题目提到变量我们直接构造payload:srgs=globals得到flag
7.矛盾
简单审计题目要求unm不能为数字又要他等于1矛盾
==看到第一时间想到弱类项绕过
构造py ?unm=1admin 得到flag
8.源代码
题目提示说源代码
像是url拿去解码得到源代码
然后更具下一句拼接在一起
上传得到flag
9.shwll
进入场景什么也没有
只剩下开头提示的一句话过狗 审计 传个s过去 拼接过waf 直接用sysmat等等命令获取flag
10.点login没反应
进入场景
像题目说的一样什么也点不动 f12发现一个超链接
进入看到一串字符 好像要传参
果然发现源代码
1.审计发现要使传入的参数是空的,cookie的值反序列化后等于key,则显示flag
cookie的值反序列化 构造反序还是不太会
2.简单审计使cookie反序==key才能得到flag;Isset判断上传是否空 是则马上执行elseif;先要得到cookie反序 因为要等于key所以拿他去
然后抓包写入ckool 得到flag
攻防世界
1.fileclude
进入场景看到一串代码
搜索知道File_get_contents()把整个文件读入一个字符串可以通过php://input绕过
通过审计知道要使file2放入该函数并且要求返回值为hello ctf file1被放入index中需要获取flag.php文件中内容用php.filter伪协议读取源代码—构造
?file1=php://filter/convert.base64-encode/resource=flag.php&file2=data://text/plain,hello ctf 得到文件base64
解密得到flag
2. fileinclude
进入场景看到一段英语翻译 知道绝对路径
F12 查看源代码 发现一段代码
审计知道cookie值传入$lan而$lan可控 $lan又包含在include用php.filter读取base64源码 抓包修改cookie得到base64
转码得到flag
3. file_include
题目描述:怎么读取文件呢?
进入场景
审计代码后 感觉是用 php://filter 加 convert.base64-encode 文件读取 flag.php 试一试提示这个
通过搜索知道应该是黑名单检测敏感字符串。 尝试出read base64等给禁了(在黑名单中)
尝试其他php://filter过滤器 得到flag
4. easyphp
进入场景
is_numeric检测变量是否为数字或数字字符串
is_array是一个函数,若变量为数组类型则返回true,否则返回false,
array_search ()函数是PHP的一个内置函数,用于在数组中搜索特定的值,如果找到该值,它将返回相应的键。
构造
?a=1e9&b=53724&c=%7B%22m%22%3A%222033%2500%22%2C%22n%22%3A%5B%5B1%5D%2C0%5D%7D
语句得到flag
5.web2(难)
进入场景 看到题目提示逆向解密
代码审计
strlen() 函数返回字符串的长度
strrev() 反转字符串顺序
substr() 函数返回字符串的一部分。substr(string,start,length)
注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。
<?php echo substr("Hello world",6); ?>从字符串中返回 "world":
ord() 函数返回字符串中第一个字符的 ASCII 值。
chr() 函数从指定 ASCII 值返回字符。并可以指定ASCII是十进制或是十六进制或是八进制。
“.” 是字符运算符,作用是把两个字符串连接起来,其使用方法:首先创建一个PHP示例文件;然后定义两个变量;最后通过“$result.$result”方式将两个变量连接起来即可
str_rot13() 函数对字符串执行 ROT13 编码。
ROT13 编码是把每一个字母在字母表中向前移动 13 个字母得到。数字和非字母字符保持不变。
由此构造逆向代码 得到flag
6.warmup
进入场景 看到一张表情包 f12看到注释文件
进入看看
发现代码 仔细观察发现另一个php文件进入看看 看到题目提示flag就在ffflllaaaggg中
现在审计代码
mb_substr()截取问号前面的 返回字符串的一部分
mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置
is_string (); 判断是不是字符型 变量是否为字符串
isset (); 检测变量是否设置并且非null
checkfile(); 检测传入函数是否为空 检测文件是否为存在
empty(); 检测一个变量是否为空
in_array();搜索数组是否存在指定的值
知道要满足2的任何一个条件就可得到flag
构造?file=source.php?/../../../../ffffllllaaaagggg
7.web_php_include
进入场景
审计代码发现是限制php上传 可以通过php伪协议绕过 得到flag
用deta协议
用cat进去看注释得到flag
8.php_rce
进入场景 查看源代码发现三个网站其中,一个跳转一个拒绝来访问,还有一个显示一串看不懂的东西 琢磨半天没发现什么东西
看首页
百度搜索thinkphp v5
漏洞分析
程序未对控制器进行过滤,导致攻击者可以用 \(斜杠)调用任意类方法。
/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=
其中:s[1][]=(Linux指令)
直接构造payload 寻找flag
从目录中看到flag 接下来用cat进入 得到flag
9.ics_05
进入场景 点击了很多东西 发现只有设备维护中心可以点击
常规f12发现一个函数 常规f12发现一个函数 ?page=index 有page这个get参数
自然联想到可能存在利用文件包含读取网页源码的漏洞
利用php内置filter协议读取文件的代码
?page=php://filter/read=convert.base64-encode/resource=index.php得到加密base64
解密得到php代码
基础知识
strpos() 函数查找字符串在另一字符串中第一次出现的位置。 注释: strpos() 函数对大小写敏感
ctype_alnum()函数是PHP中的字符类型(CType)函数,用于检查给定的字符串是否包含字母数字字符。
preg_replace 函数执行一个正则表达式的搜索和替换返回值 如果 subject 是一个数组, preg_replace() 返回一个数组, 其他情况下返回一个字符串。 如果匹配被查找到,替换后的 subject 被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL。
语法
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
参数说明:
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。
$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
$count: 可选,为替换执行的次数。
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向(该函数漏洞)
引用替换完之后
提示:要确保 replacement 构成一个合法的 PHP 代码字符串,
否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
仔细审查发现 输入的参数有三个,并且会代入到一个preg_replace函数中
先要构造伪造ip
preg_replace函数/e漏洞:查看所有文件
payload:/index.php?pat=/abc/e&rep=system("ls")&sub=asdsadasabc
Cd到 s3chahahaDir 这个文件夹下查看内容
cd命令为 system("cd%20s3chahahaDir%26%26%20ls")
或
发现可以进行命令执行,并且发现可疑目录,进入目录并查看文件
payload:/index.php?pat=/abc/e&rep=system("cd%20s3chahahaDir%26%26%20ls")&sub=asdsadasabc
进入文件 发现flag文件
使用cat命令读取flag.php中的内容
命令代码:system("cat%20s3chahahaDir/flag/flag.php")
?pat=/abc/e&rep=system("cat%20s3chahahaDir/flag/flag.php")&sub=asdsadasabc得到flag
10.php2
进入场景—看到一句话:您能访问此网站吗?(Can you anthenticate to this website?)
常规操作f12看原代码没有发现-进入indexphp也没有反应用目录扫描软件发现index.phps进入发现源代码
在此之前搞清楚urldecode urlencode的区别
urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%。 urldecode()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串,其原理就是把十六进制字符串转换为中文字符
.浏览器本身会进行因此url解码,这里相当于进行两次url解码,只需要让id后的值等于admin进行两次url编码,为了方便我们可以将a进行两次编码
通过审计发现要使admin不等于get【id】经过urldecode()后相等构造id=%2561dmin得到flag
Buuctf
1. BackupFile
打开靶机只有一句话要求我们找出源码,扫描后台工具可以用御剑或者dirsearch来进行扫描
这里使用dirsearch来扫描后台文件
常见的备份文件后缀名有 .git .svn .swp .~ .bak .bash_history
对这两个进行检验看看那个是
对下载的源码进行代码审计
源码显示要传递一个key
当key=str时flag值出现
而且注意到key==str是弱类型
构造key=123即可出现flag
2. havefun
打开页面发现一只小猫咪
页面没有其他东西了F12查看源码
当传递的值cat==dog时会出现东西
获得falg值