题目来源
NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem
[SWPUCTF 2021 新生赛]gift_F12
这个题目简单打开后是一个网页
我们一般按F12或者是右键查看源代码。接着我们点击ctrl+f后快速查找,根据题目给的格式我们搜索ctf即可看到flag,如下图所示。
或者是
接着根据题目所给的格式NSSCTF{}写入flag即可解出 ,这里给大家一个示例
NSSCTF{We1c0me_t0_WLLMCTF_Th1s_1s_th3_G1ft}
[SWPUCTF 2021 新生赛]jicao
知识点:网站请求的POST、GET方法,JSON
阅读源码了解到需要post值给id,get值给json,json_decode()
可以对一串JSON进行解码,故需要构造payload为 {"x":"wllm"}
之后:
方法一:使用HackBar进行/?id=wllmNB,然后post json
方法二:使用burp直接修改请求头
另:json
格式为
{"name": "John Doe", "age": 18, "address": {"country" : "china", "zip-code": "10000"}}
JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON的值:
3.1 JSON的构成: ws 值
3.2值可以是对象、数组、数字、字符串或者三个字面值(false、null、true)中的一个。值中的字面值中的英文必须使用小写。
3.2.1对象由花括号括起来的逗号分割的成员构成,成员是字符串键和上文所述的值由逗号分割的键值对组成,如:引用JSON中的对象可以包含多个键值对,并且有数组结构,该语言正是一次实现过程内容的描述。
3.2.2数组是由方括号括起来的一组值构成,如:
[3, 1, 4, 1, 5, 9, 2, 6]
3.2.3 字符串与C或者Java的字符串非常相似。字符串是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
3.2.4数字也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
解题方法如下:
这里大家在火狐浏览器右上角点击...然后点击扩展HackBar安装然后点击题目,接着点击检查,点击load URL加入?json={"x":"wllm"} 接着设置为Post data
将下面的值写入id=wllmNB然后点击Execule即可解出flag
[SWPUCTF 2021 新生赛]easy_md5
题目如下
既要两变量个值不相同,又要两个变量md5值一样,
可以发现此时判断md5值是否一样用的是==
,这是php的弱类型比较,
方法一: 可以使用带0e开头的数字穿进行传递参数,因为php会将0e开头的数字转化为0,故此时md5值相等,而两个变量值不相等;
方法二: 可以传递数组,如name[]=123,password[]=456,md5不能加密数组,故两个md5返回的都是null
另:若遇到===
这样的强类型比较,方法一就失效了,方法二仍然有效,或者还可以使用软件fastcoll进行md5碰撞,生成两个字符串使得他们的md5值相同
另:0e开头的数字
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
解题方法
选上面两个md5的值对撞即可得到flag
[SWPUCTF 2021 新生赛]include
题目:
那我们就上传一个file,在搜索栏中 ?file 、?file=ture 、?file=false都可以试一下如下图所示:
看到代码后发现是伪代码,这里我讲一下什么是伪代码:
1.什么是PHP伪协议?
PHP伪协议是PHP自己支持的一种协议与封装协议,简单来说就是PHP定义的一种特殊访问资源的方法。
有些伪协议成功执行需要allow_url_fopen和allow_url_include的支持。
allow_url_fopen On/Off 允许或禁止打开URL文件
allow_url_include On/Off 允许或禁止引用URL文件2.什么时候用PHP伪协议?
文件包含!!!的时候,可能遇到的文件包含函数:
1、include
2、require
3、include_once
4、require_once
5、highlight_file
6、show_source
7、flie
8、readfile
9、file_get_contents
10、file_put_contents
11、fopen (比较常见)1.常见的php伪协议
php://input
php://input 是个可以访问请求的原始数据的只读流,获取POST请求数据的协议
当enctype=”multipart/form-data” 的时候 php://input 是无效的。
php://input 伪协议 成功执行前提
php.ini 中的 allow_url_include设置为Onphp://filter
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。
在利用上很多都是与包含函数结合使用,读入或者输出获取文件源码然后编码让其不执行从而输出
补充:
php伪协议
常见的php伪协议(1)file:// 访问本地文件系统
2)http:// 访问HTTP(S)网址
3)ftp:// 访问FTP(S)URL
4)php:// 访问各个输出输入流
5)zlib:// 处理压缩流
6)data:// 读取数据
7)glob:// 查找匹配的文件路径模式
8)phar:// PHP归档
9)rar:// RAR数据压缩
php://filter 的使用:
如
php://filter/read=convert.base64-encode/resource=index.php
php://filter/resource=index.phpphp://filter 伪协议组成:
read=<读链的筛选列表>
resource=<要过滤的数据流>
write=<写链的筛选列表>
php://filter/read=处理方式(base64编码,rot13等等)/resource=要读取的文件read 对应要设置的过滤器:
常见的过滤器分字符串过滤器、转换过滤器、压缩过滤器、加密过滤器
其中convert.base64-encode ,convert.base64-decode都属于 转换过滤器zip://与bzip2://与zlib://协议
zip:// 等属于压缩流的协议,通过直接压缩普通文件为zip文件,再通过zip:// 协议读取,可以直接执行php代码。压缩后的zip文件可以随意修改后缀也不影响zip://协议读取。(注意是如phpinfo.txt直接压缩为zip,而不是文件夹压缩zip)
压缩及协议访问格式:
压缩文件为.zip后缀
zip://绝对路径/phpinfo.zip%23phpinfo.php
压缩文件为.bz2后缀
compress.bzip2://绝对路径/phpinfo.zip/phpinfo.php
压缩文件为.gz后缀
compress.zlib://绝对路径/phpinfo.zip/phpinfo.phpdata://
data://伪协议可以通过请求提交的php代码数据配合文件包含函数可以达到代码执行效果。
data://伪协议 成功执行前提
php.ini设置allow_url_include 与allow_url_open都为On。data://协议的格式是: data://数据流封装器,相应格式数据
根据题目我们发现有include_once函数;
include_once():在脚本执行期间包含并运行指定文件。该函数和include 函数类似,两者唯一的区别是 使用该函数的时候,php会加检查指定文件是否已经被包含过,如果是,则不会再被包含。
于是我们进行伪造:
php://filter/convert.base64-encode/resource=flag.php
即可得到一串字符,这里给大家补充一下base64的概念
Base64编码和解码的基本概念
- 编码:将二进制数据转换为ASCII字符的文本格式。Base64编码使用64个字符(A-Z, a-z, 0-9, +, /)来表示数据。
- 解码:将Base64编码的文本转换回原始的二进制数据。
最后我们base64解码即可获得flag
[SWPUCTF 2021 新生赛]easy_sql
我们打开题目
上面写了wllm是参数,那么这个题给参数可能是让我们sql注入。
https://download.csdn.net/download/m0_73951999/89721502https://download.csdn.net/download/m0_73951999/89721502
这里给一个链接点进去就可以看到这道题怎么解sql的了。
这位大佬写的解题思路非常清晰,所以这里我就不过多赘述。
[SWPUCTF 2021 新生赛]easyrce
题目如下:
解题思路如下:
我们可以发现是用的是exec()函数,无回显,并且是GET请求。
这里给大家补充一下知识,我们进入前看到标题REC这里给大家说一下
REC题目,常用的几个系统命令执行函数
system();
passthru();
exec();
shell_exec();
popen();
proc_open();
pcntl_exec();
这些都是php通过系统命令来查看文件内容比如我举个例子system("ls");这种通常在没有任何限制的情况下可以查看所有文件,但是题目肯定会设计一些困难,比如说不给你输入空格、=、#、&等这种特殊字符常常被限制,那么一般怎么绕过呢,我们可以这样子,空格在php执行中(不考虑版本的情况下)可以使用%20来代替,比如说system("ls /"); 时可以改为system("ls%20/"),a[]=1时可以改为a[]%=1,而#号可以使用%23来代替。(这里大家注意一下字符输入的时候一定一定要对,不然不会有反应甚至404)
好了回归正题,我们可以开始解了,根据上面已知的信息,我们可以先写一个?url=system("ls");发现是index.php那可能是让我们确定一下路径我们可以这样子写?url=system("ls /");
?url=system("ls20%/");我们也试一下
可以发现没问题, 然后我们看到的这些所有文件了
我们仔细看一下哪个像flag很明显是flllllaaaaaaggggggg,那么我们就要去这个路径下面的文件才能找到flag ,这里我们要使用cat或者是tac,这个我解释一下,这些都是查看的意思,简单来说就是通过执行cat或者是tac路径下的文件你们我们接下来如图所示,解题方法如下:
第一种通过?url=system("cat /f*");通过f*指针查找有关f的
第二种 ?url=system("cat20%/fflllllaaaaaaggggggg");替换空格也可以得到flag
第三种 ?url=system("cat20%/fflllllaaaaaaggggggg");
第四种?url=system("cat20%/fflllllaaaaaaggggggg");
其实还有很多方法解出大家都可以试一下,这里我给大家拓展一下怎么用蚁剑做这道题
下面是中国蚁剑的资源:
https://download.csdn.net/download/m0_73951999/89724306https://download.csdn.net/download/m0_73951999/89724306
GET请求url,看到eval就是蚁剑连接,但是它要POST请求才行,那就直接用一句话木马连接它
也就是利用eval这句话然后改成GER改成POST后面url改成传入的参数
像我这样子添加数据即可 node5.anna.nssctf.cn:26152/?url=eval($_POST['a']);然后在点击进去
点击fflllllaaaaaaggggggg文件后发现flag