大家好,我是YAy_17,是一枚爱好网安的小白,正在自学ing。
本人水平有限,欢迎各位大佬指点,一起学习,一起进步⭐️。
⭐️此后如竟没有炬火,我便是唯一的光。⭐️
最近除了上课,就是准备取证去了;参加了西南石油的新生赛,感觉还是挺简单的;
首先入口界面如下:
随便输入先尝试一下嘛,账号:admin,密码:admin;(之后提示我们用户名是实验室名)
(其实这里的账号和密码是直接找群里的群主要到的!)账号为NSS;密码为2122693401;
之后便直接登录进来看到如下的php代码
显然这就是intval函数的漏洞,intval函数有个特性:”直到赶上数字或正负符号才开始作转换,再遇到非数字或字符串结束时()结束转换”;那么我们输入的如果是12345a的话,当遇到a的时候便停止了转换,结果便得到了12345;此时与后面的12345进行了弱类型的判断,成立便输出了flag;
拿到题目就是这样的,其实看到这里再结合题目的名称,就想到了“奇妙的字符串”;先尝试随便输入字符,发现一直都是这个页面;抓包看一下;同时抓响应包,在响应包中发现了hint!
确实这里执行了查询语句,但是在通过where的时候,由于条件不匹配,导致什么信息都没有;
需要password = md5($pass,true)为真的时候,才会执行select * from 'admin'
那么md5函数会将我们的输入,经过加密,然后再转换为16字符的二进制;有一个“奇妙的字符串”:ffifdyop经过md5加密变成276F722736C95D99E921722CF9ED621C;之后转换为16字符的二进制又变成了'or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c ,这串字符的前面几位刚好是' or '6
select * form admin where password =' or '6....
在mysql内,用作布尔型判断时,以1开头的字符串会被当做整型数。要注意的是这种情况是必须要有单引号括起来的;比如password=' or '1xxxx',那么就相当于password=' or 1,所以返回值就是true;故这里的payload为ffifdyop
之后便跳转来到了这里,先看源码嘛!
还是md5,这里有两个参数x和y;x不可以等于y,同时x、y在经过md5加密之后相等;
两种方法嘛!
所以传数组!数组方便,第二种大家可以去网上找,自己之前也整理过;
什么东西是11位啊?-------->手机号???
随便输入一个手机号,弹窗“try again”;这个题有点像MISC了;网页种发现了一张xxx.古迹酒店;直接高德地图找,会找到他的电话,输入即可!
上来就是直接代码审计了;
条件:我们通过GET方式传入的file参数的前三位包含着php;
那么什么语句包含着php....(php://filter??)之后尝试去使用php伪协议;
file=php://filter/read=convert.base64-encode/resource=flag.php
得到了一串经过base64编码的字符串,尝试通过base64解码;
";
echo "real_flag_is_in_'flag'"."
";
fake flag;提示:real_flag_is_in_'flag'
那么就依然使用php伪协议去读flag!经过base64解码之后便可以拿到真正的flag;
“年轻的webdog哦,如果连这关都创不过还是去卷pwn和re吧”
先看源码;得到如下:
也就是说原值经过弱类型判断依然是等于md5加密之后的值;我们便可以找0e开头的数值,经过md5加密之后得到的值依然是0e开头即可;
0e215962017是
0e291242476940776845150308577824
之后来到如下的界面:
这里我就一个个点,多数都是404;search这里的话通过抓包看一下;
这里便找到了hint,提示我们去fl4g.php看一下;
还是抓包看一下响应数据包,依然还是存在着hint,套娃;
去对应的文件看一下,又开始了代码审计:
18){
die("This is too long.");
}
else{
eval($get);
}
}else {
die("nonono");
}
}
?>
经过get传参get,get中不可以存在着空格,并且如果get中存在着flag,那么会将flag替换为空格;
get的值的长度还不能超过18;尝试get传入一句话小马;eval($_post[1]);
最终形成eval(eval($_post[1]););为什么这里不能直接传入$_POST[1] ,是因为要激活一下eval函数,而我们直接传入$_POST[1],是不会出现结果的;这里我还不知道为什么是这样的?本地测试是需要加上eval的!
之后就是直接连接蚁剑;
成功上传;尝试上传php文件;将之前的jpg文件接着上传,修改了其中的内容和后缀名,没有修改MIME信息;其实这里还会校验MIME信息的!
提示文件的后缀名中有ph,那么相应的也就过滤了pht、phtml等格式;这里尝试上传一下.htaccess文件,发现是可以上传的;
之后便是上传jpg的文件,但是在这里遇到了过滤,当我们的文件中存在是可以上传的!
之后便可以直接连蚁剑啦!但是我在连接蚁剑之后,在flag文件中没有内容;可能是flag文件中就是没有文件;是在phpinfo中找到的flag;
题目如下:
无法查看源代码,dirsearch扫描文件,也没有扫描到敏感的文件;只能抓包,同时去抓一下响应的数据包,发现了有个js的文件,尝试访问该文件,发现该文件的最后一行是这样的:
发现括号里面就是base64嘛!然后尝试解码看一下啊,又是另一个php的文件,尝试访问:
发现有一个nss类,里面存在着一个静态的方法,通过GET方式进行传参,传入的参数又经过了正则的匹配,但是正则并没有大小写过滤,所以使用的就是大小写的绕过;
payload: p=Nss::Ctf 又提示不是nss这个类是不是nss2呢 换一下类名即可;
php://filter伪协议直接读flag.php,之后又告诉你是/flag文件;
ez_rce
页面如上所示,直接上dirsearch了, 扫描到了robots.txt文件,尝试访问;
访问之后,提示/NSS/index.php/;继续访问出现了熟悉的界面:
thinkphp5,RCE!当然题目也已经提示我们了,这里直接就网上百度payload即可,我这里就直接用了工具;之后就是直接进行漏洞利用即可了,注意的是flag并不在根目录下面的flag文件中,flag文件中是空的,真正的flag实在/nss中,害我找了半天(眼睛属实太大了,没看见)
相对安全的方式传参,那就是post,参数是nss;先尝试传参nss=1看看什么情况
看到的是如下的界面,这两个flag都是假的,不用尝试,单引号的闭合方式,之后就是发现过滤了and、or、union等关键字,都是可以通过双写进行绕过的!之后就是通过基于post方式的布尔盲注脚本来进行注入了,最后爆出来的列名存在id,Secr3t,flll444g,但是在flll444g中爆出来的flag又是假的,真正的flag存在于Secr3t列中;
lt;
$a($this->lly);
}
}
unserialize($_POST['nss']);
highlight_file(__FILE__);
?>
反序列化漏洞点在$a($this->lly);相当于可以命令执行了;直接构造
将最终的序列化之后的结果直接传入到nss中即可;