1、GET
地址栏加上?what=flag
这段代码是PHP语言写的,它从一个HTTP GET请求中获取名为what的参数的值,并将其存储在变量$what中。然后,它输出这个变量的值。如果$what的值等于字符串'flag',它还会输出字符串'flag{****}'。
下面是这段代码的逐行解释:
- $what=$_GET['what'];
-
- 这行代码从HTTP GET请求的查询字符串中获取名为what的参数的值,并将其存储在变量$what中。例如,如果URL是http://example.com/script.php?what=test,那么$what的值就会是test。
- echo $what;
-
- 这行代码输出变量$what的值。
- if($what=='flag')
-
- 这行代码检查变量$what的值是否等于字符串'flag'。
- echo 'flag{****}';
-
- 如果上面的if条件为真(即$what的值等于'flag'),这行代码就会执行,输出字符串'flag{****}'。
需要注意的是,这段代码存在安全隐患,因为它直接将用户输入的值输出到页面上,这可能导致跨站脚本攻击(XSS)。在实际应用中,应该对用户输入进行适当的验证和转义,以防止安全漏洞。
此外,这段代码也没有对$_GET['what']的存在性进行检查。如果请求中没有what参数,那么$what变量将会是null,这可能会导致意料之外的行为或错误。在实际应用中,应该检查参数是否存在,并处理不存在的情况。
2、POST
涉及到post请求,无法像get请求一样直接在url地址栏中直接输入,需要用burpsuite抓包
原报文
GET / HTTP/1.1
Host: 114.67.175.224:10151
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: close
Upgrade-Insecure-Requests: 1
修改后的报文
POST / HTTP/1.1
Host: 114.67.175.224:10530
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type:application/x-www-form-urlencoded
Content-Length: 17
what=flag&=
改变:
-
- GET 改为POST
- 增加Content-Type:application/x-www-form-urlencoded
- 增加what=flag&=
post类型的报文:
- POST类型的报文主要用于向服务器提交数据。与GET请求将数据放在URL中不同,POST请求将数据放在请求体(如上面的what=flag&=)中,因此适用于提交大量数据或敏感信息的场景,如表单提交、文件上传等。
- POST报文的结构主要包括请求行、请求头部、空行和请求体。请求行由请求方法字段(这里是POST)、URL字段和HTTP协议版本字段组成,例如“POST /sn/index.php HTTP/1.1”。请求头部由多个关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔,常见的请求头包括Accept、Content-Type、Content-Length等。空行用于通知服务器以下不再有请求头。请求体则包含客户端要发送给服务器的数据。
- 在发送POST请求时,数据通常是以表单形式提交的,包括文本字段、复选框、单选按钮等。这些数据会被编码成特定的格式(如application/x-www-form-urlencoded或multipart/form-data),然后放在请求体中发送给服务器。
- 需要注意的是,POST请求没有长度限制,因此可以传输大量数据,但也需要注意数据的编码和格式,以确保服务器能够正确解析和处理。同时,由于POST请求包含数据在请求体中,因此在安全性方面需要更加注意,避免数据泄露或被篡改。
- 如果您想要发送what=flag这个参数,它应该作为查询字符串放在请求行的URL后面,而不是放在Host头中。
- Content-Type:Content-Type是一个MIME类型的字符串,它用于指定HTTP请求或响应中实体主体的媒体类型。在POST请求中,Content-Type字段特别重要,因为它告诉服务器请求体(即body部分)中数据的格式或类型。
3、计算器
<input type="text" class="input" maxlength="1">源码修改input输入框的maxlength值即可
4、矛盾
$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}
构造payload语句 ?num=1abc
解题思路如下:
- 理解代码逻辑:
-
- $num变量从GET请求中获取num参数的值。
- 使用is_numeric()函数检查$num是否为数字或数字字符串。
- 如果不是数字,则输出$num的值,并检查它是否等于字符串'1'。
- 如果是,则输出'flag{**********}'。
- 发现逻辑漏洞:
-
- 尽管is_numeric()函数会检查变量是否为数字或数字字符串,但随后的$num==1比较会在PHP中触发类型强制转换,使得字符串'1'被视为等同于整数1。
- 构造输入:
-
- 由于is_numeric()会接受数字字符串作为有效输入,我们可以构造一个非整数的数字字符串来绕过第一个条件检查。
- 由于PHP中的类型强制转换,我们可以使用字符串'1'来触发第二个条件检查。
- 发送请求:
-
- 构造一个GET请求,将num参数设置为一个非整数的数字字符串,例如'1abc'。
- 发送这个请求到目标服务器,并观察响应。
- 分析响应:
-
- 如果服务器返回了'flag{**********}',则说明成功利用了这个逻辑漏洞。
- 如果服务器没有返回预期的响应,可能需要重新检查代码逻辑或尝试不同的输入。
- 反思与总结:
-
- 在实际开发中,应该避免使用类型强制转换进行比较,而应该明确变量的类型。
- 对于用户输入,应该进行严格的验证和过滤,以防止潜在的安全风险。
- 在CTF比赛中,要仔细阅读题目描述和代码,发现并利用其中的逻辑漏洞。
- 在PHP中,非整数的数字字符串(如'1abc')在特定上下文中会引发特定的行为。根据您之前提到的代码片段,当$num被赋值为'1abc'时,is_numeric($num)会返回true,因为'1abc'包含一个有效的数字开头。但是,这并不意味着'1abc'可以作为一个整数或浮点数来使用。
- 当您尝试将'1abc'用于数值比较或运算时,PHP通常会尝试将字符串转换为一个数值。在这种情况下,转换会在遇到非数字字符时停止。因此,'1abc'在数值上下文中会被解释为整数1。
- 这是因为在PHP中,当字符串以数字开头时,intval()函数或类型强制转换会将其转换为整数,直到遇到第一个非数字字符为止。所以'1abc'会被转换为整数1。
- 但是,请注意,这并不意味着'1abc'严格等于整数1。当您使用==运算符进行比较时,PHP会进行类型强制转换,所以'1abc'等于1。但是,如果您使用===进行严格比较,那么它们将不相等,因为它们的类型不同(一个是字符串,一个是整数)。
5、你必须让他停下
在CTF(Capture The Flag)比赛中,当面对一个需要你“让它停下”的题目时,这通常意味着你需要找到一种方法来中断、终止或阻止某个功能、服务或代码段的执行。解题方法取决于题目的具体要求和上下文,但以下是一些通用的解题思路:
- 理解题目背景:
-
- 仔细阅读题目描述,理解它的上下文和要求。
- 确定你要“停下”的是什么:是一个程序、一个服务、一个循环、一个计时器,还是一个特定的功能?
- 分析代码:
-
- 如果题目提供了代码片段,仔细分析它,找出可能的执行路径和逻辑。
- 确定代码中的哪个部分需要被停止或中断。
- 查找停止机制:
-
- 检查代码中是否有现成的停止机制,比如一个标志变量、一个特定的输入或命令。
- 如果存在,尝试使用它来停止代码的执行。
- 利用漏洞或错误:
-
- 如果代码存在漏洞或错误,可能会导致它崩溃或进入无限循环。
- 尝试利用这些漏洞来中断代码的执行。
- 发送特殊输入:
-
- 如果题目要求你通过输入来停止某个程序或服务,尝试发送特殊的输入或命令。
- 这可能是一个特定的字符串、一个格式错误的请求或一个超出范围的数值。
- 利用外部工具:
-
- 如果代码是在一个可控的环境中运行的(比如一个沙箱或虚拟机),你可以尝试使用外部工具来中断它。
- 例如,你可以发送一个终止信号给进程,或者强制关闭运行代码的容器。
- 查阅文档或提示:
-
- 如果比赛提供了相关的文档或提示,查阅它们可能会给你一些线索。
- 有时候,题目设计者会在文档中故意留下一些误导性的信息或正确的解决方案。
- 反思与尝试:
-
- 如果你的第一次尝试失败了,不要气馁。
- 反思你的方法,尝试不同的思路或策略。
记住,CTF比赛中的题目通常设计得相当巧妙,可能需要一些创造性的思维和耐心来找到解决方案。在解题过程中,保持冷静和专注,不断尝试和学习,你会逐渐提高自己的解题能力。
解题步骤:
- 浏览器禁用js,让它不刷新
- 一直点击浏览器的刷新按钮,当出现如图的图片时,刷出来flag图的图片时,刷出来flag
- 右键,检查即可
6、本地管理员
题目名称为“本地管理员”,盲猜用户名为admin
右键,检查代码发现一串编码,为base64编码,解码得到密码test23
bp进行xff伪造,添加:X-Forwarded-For:127.0.0.1,发送请求即可得到flag
xff伪造
- X-Forwarded-For(XFF)是一个HTTP请求头字段,用于记录代理链中的每个代理服务器的IP地址。当一个请求经过一个代理服务器时,该代理服务器会将其IP地址追加到X-Forwarded-For字段的末尾。因此,通过读取X-Forwarded-For字段,可以获取到原始请求的客户端IP地址。
- 关于X-Forwarded-For字段的伪造,特别是将其值设置为“127.0.0.1”,这通常是为了欺骗服务器,使其认为请求来自于本地主机(即127.0.0.1)。这种行为可能是出于多种目的,包括但不限于绕过某些安全限制、进行未授权的访问或执行恶意操作。
- 然而,需要强调的是,伪造X-Forwarded-For字段是不道德且非法的行为,它违反了网络安全的基本原则和法律法规。此外,现代的网络系统和应用程序通常都有一套完整的安全机制来防范这种伪造行为,包括对X-Forwarded-For字段的验证和过滤。
7、变量1
8、头等舱
头,暗示响应头
bp抓包,发现flag在响应头
9、网站被黑
为何在链接后面加上了一个index.php能确定是否为PHP网页
就拿百度来说吧,www.baidu.com和www.baidu.com/index.php其实是一样的,
直接输入http://www.baidu.com/,会默认找到文件夹下的index页,而www.baidu.com/index.php只不过是告诉浏览器要访问的是index页,最终都是index.php,如果文件夹下没有index页,就会列出当前目录下所有文件,这个就比较危险了,当然,可以通过服务器设置权限,避免被人看到你的网站结构
- 御剑扫描后台,扫描出shell.php,打开链接是一个webshell,尝试admin等弱密码无效
- 打开burp进行爆破,这里选择Simple list,字典选择burp自带的Passwords 或 选择Runtime file,字典用username.txt
- 爆破得到密码hack(如下,长度不一样),输入到shell.php中即可得到flag
10、Simple_SSTI_1
题目名为Simple_SSTI_1,何为SSTI:
“服务器端模板注入”(Server-Side Template Injection,简称SSTI)
SSTI 是一种攻击技术,攻击者可以通过向应用程序注入模板代码来执行恶意操作。当应用程序使用模板引擎来渲染用户提供的输入时,如果输入没有被正确地转义或清理,攻击者就可以利用这个漏洞来执行任意模板代码。
右键,检查发现:<!-- You know, in the flask, We often set a secret_key variable.-->
Flask是一个使用Python编写的轻量级Web应用框架,其WSGI工具箱采用Werkzeug,而模板引擎则使用Jinja2
如果 Simple_SSTI_1 是关于SSTI的题目,那么解题原理可能涉及以下几个方面:
- 识别模板引擎:首先,需要确定应用程序使用的模板引擎类型(如 Jinja2、FreeMarker、Thymeleaf 等)。这通常可以通过观察应用程序的响应、查阅文档或源代码等方式来完成。
- 构造注入载荷:根据识别的模板引擎,构造一个有效的注入载荷。这个载荷需要能够利用模板引擎的某些特性来执行恶意操作。例如,在某些模板引擎中,可以使用 ${} 来执行表达式,攻击者可能会尝试注入这样的代码片段。
- 执行恶意操作:通过注入的模板代码,攻击者可以执行各种恶意操作,如读取文件、执行命令、获取敏感信息等。这些操作的具体内容取决于模板引擎的功能和应用程序的上下文。
- 绕过安全措施:在某些情况下,应用程序可能采取了一些安全措施来防止SSTI攻击。解题者需要分析这些措施,并尝试找到绕过它们的方法。这可能涉及对应用程序的逻辑、配置或过滤机制进行深入研究。
思路:地址栏添加?flag={{config}}或?flag={{config.SECRET_KEY}},后一个能直接筛选出来结果
- 在URL中,? 通常用于开始查询字符串(query string),它包含了一系列键值对,用于传递参数给服务器。
- ?flag={{config}},flag 是一个键(key),而 {{config}} 看起来像是某种模板语言的占位符。这个占位符可能会被替换为某个具体的值,这取决于这个模板是如何被解析和渲染的。
- 如果这是在某个使用Jinja2模板引擎的Flask应用上下文中,{{config}} 可能会在模板渲染时被替换为某个配置值。例如,如果 config 是一个变量,其值为 "true",那么最终的URL可能会是 ?flag=true。
- 然而,直接在URL中嵌入模板占位符并不总是安全的。如果 config 的值来自不可信的源,这可能会导致安全漏洞,如跨站脚本攻击(XSS)或注入攻击。因此,在构建URL时,应始终确保使用经过适当验证和转义的值。
- 最后,?flag={{config}} 这种写法可能是用于动态生成URL的,但这取决于具体的上下文和应用逻辑。
- 选择get的传入方式,一般secret-key中存在有价值的东西,或者说在config中
- config的用法,config 也是 Flask模版中的一个全局对象,它包含了所有应用程序的配置值,所以可以使用 config.xxx 来查看该对象的属性值。
- python和jinja 2的的ssti模板注入题目,需了解基础的jinja语法和网页页面渲染方式