BUUCTF-Web(一)
从CTF题目开始练习,初始平台:BUUCTF
[极客大挑战 2019]EasySQL
入门SQL注入,万能密码登录admin账户
[HCTF 2018]WarmUp
入门代码审计
f12 看到 hint,查看源码,发现存在 hint.php
,得知flag
所在文件名。
审计source.php的代码,发现获取参数的方法是在参数末尾加?
,然后读取?
的下标,提取此下标之前的字符串,我们只需要在白名单允许的文件名后手动跟一个问号即可通过白名单,此时可在问号后跟任意字符。
php中include在解析字符串时,遇到%00
或者?
会出现截断效果,即把前后两段字符视作两个独立的字符串变量。根据此特性,?
后直接跟flag文件的路径即可把flag包含进来,
[极客大挑战 2019]Havefun
f12看hint,传目标参数即可
[ACTF2020 新生赛]Include
查看响应包,可以得知后端环境是php7.3
,利用伪协议读取文件,这里对伪协议做了一定限制,可以用php://filter/read=convert.base64-encode/resource=flag.php
读取 flag.php 的内容
[强网杯 2019]随便注
堆叠注入。一直不明白起名字的人怎么起的这个名字,不太应景。就是常规的没有过滤'
和;
的情况,然后以此对sql语句进行恶意截断,后跟攻击者想要执行的sql命令,主要缺点是因为看不到无数据库数据回显的命令的执行情况,所以不知道相关命令是否能够执行,一般必须要结合某些可以拿到关键输出的场景使用,比如本题所举例子。
payload-1
1 | -1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;# |
利用MySQL的预编译功能 set
prepare
execute
绕过select的检测:
- set用于设置变量名和值
- -1’;
- prepare用于预备一个语句,并赋予名称,以后可以引用该语句
- Set @sql = CONCAT(‘se’,’lect * from
1919810931114514
;’);
- Set @sql = CONCAT(‘se’,’lect * from
- execute执行语句
- Prepare stmt from @sql;
- deallocate prepare用来释放掉预处理的语句
- EXECUTE stmt;
payload-2
1 | 1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);# |
针对本题可以发现默认使用的数据库中有两个表,flag就在另一个表中,利用alter
命令修改表名和列名,使得默认查询的字段为flag对应的字段,再用万能密码1' or 1=1;#
查询所有数据即可看到flag
- 1’;
- alter table words rename to words1;
- alter table
1919810931114514
rename to words; - alter table words change flag id varchar(50);
[SUCTF 2019]EasySQL
存在堆叠注入可以执行部分命令,题目过滤了部分关键字,不能直接查字段。堆叠注入在该题效果有限。多次尝试可以发现,当输入为数字时,会有1
的回显,输入为字符的时候没有回显。
这里推测应该存在类似select 输入参数||xxx from xxx
的查询语句。尝试输入 *,1
直接得到flag。搜了大佬的wp,发现还可以构造 1;set sql_mode=pipes_as_concat;select 1
,sql_mode=pipes_as_concat
可以把 ||
的作用由 or 变成 拼接字符串,这里的拼接是指将 ||
前后的目标查询字段的查询结果拼接。
[ACTF2020 新生赛]Exec
考虑到这里实现的时ping的功能,猜测其实是直接执行的 ping ip
的命令,在各种 shell
中基本都支持使用 &
来连续执行多条命令。我们构造输入为 ip & pwd
,发现输出了当前目录,将 pwd
换为 cat /flag
得到flag
[极客大挑战 2019]Secret File
第一层通过字体颜色和背景色做了一个小隐藏,CTRL+A 就能看到,点击可以进入第二层。
第二层给了一个点击事件,查看路径发现对应的是 action.php
,但最终响应的是 end.php
,说明中间有一个快速的跳转,burp抓一下包,得到 action.php
的内容,指向 secr3t.php
。
访问 secret.php
,给出了其对应的源码,提供了一个file
传参,可以包含指定的文件,并且给出了flag文件的位置。这里直接指定flag文件会发现看不到flag,很明显flag被以代码的形式写在文件中,这里可以通过伪协议进行文件包含来加载文件中的全部内容。
具体构造为 secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php
。由此可以将flag文件以base64编码的形式被包含进来响应到前端显示。解码即可拿到flag。
[GXYCTF2019]Ping Ping Ping
进去给了个传参提示,可以传被ping的ip,这里直接猜测后台是直接将传入参数拼接到系统命令中了,构造:127.0.0.1|pwd
,得到路径回显,查看目录下文件发现 flag.php
,尝试直接读取,发现过滤了空格在内的多个符号,且对flag进行了贪婪匹配。
这里我们利用bash执行命令的特性,构造如下payload:
1 | ?ip=127.0.0.1;a=f;b=l;c=g;d=a;cat$IFS$9$a$b$d$c.php |
即可获得flag。贪婪匹配中flag四个字母按顺序进行了匹配,我们乱序将其单独赋值给四个变量,然后对变量值拼接从而cat flag.php
此题也可利用bash的内联执行或者管道符传值求解。
内联执行:
1 | ?ip=127.0.0.1;cat$IFS$1`ls` |
管道符:
1 | ?ip=127.0.0.1&echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh |