WEB-POLARCTF

注入

打开查看源代码发现有个id=1

传参试了一下发现有注入

假设原SQL查询为SELECT * FROM table WHERE id = '用户输入的值'。

当用户输入']|//*|//*['时,如果应用程序未对输入进行充分过滤或参数化处理,该输入可能被直接拼接到SQL语句中,导致语句变为SELECT * FROM table WHERE id = '']|//*|//*['。

这种注入可能改变SQL语句的原始逻辑,例如通过注释符/*或--来忽略原查询的其余部分,或者通过逻辑运算符|来构造恒真条件,从而绕过身份验证或返回额外数据。

字符串技术拆解-----'']|//*|//*['

  • ']:闭合原SQL语句中的单引号('),使后续字符脱离字符串约束,成为可执行代码。
    • 原语句:SELECT * FROM table WHERE id = '用户输入的值'
    • 注入后:... WHERE id = '']|//*|//*['→ 单引号被闭合,]后的内容成为新代码段。
  • |:在SQL中通常表示位或运算符(如MySQL中a | b计算二进制位或),但在此场景中更可能用于分割攻击载荷构造逻辑条件(如OR 1=1恒真条件)。
  • ///*:数据库注释符,不同数据库解析规则不同:
    • MySQL/*开启多行注释,*/结束;-- (注意空格)为单行注释。
    • PostgreSQL--为单行注释,/* ... */为多行注释。
    • SQL Server--为单行注释,/* ... */为多行注释,且支持[注释内容]语法。
  • [:可能用于闭合注释符(如/* [ ... */)或作为字符串的一部分混淆解析。

swp

打开是个提示

true .swp file?

然后查看一下swp文件发现一串代码,然后就要开始夏季吧分析了

/.index.php.swp

定义了一个函数 然后返回了一串看不懂的代码 直接现学现用 但是依旧看不懂 

首先网站用post方式接收了一个xdmtql变量,用if判断变量是否是数组,不是数组接下来交给jiuzhe函数,这个函数的作用是去匹配变量里的sys nb,匹配到了就输出nijilenijile,没有匹配到就进入下一个if语句,strpos这个函数的作用是匹配sys nb,如果匹配到了,就输出ture,然后由于有!所以变成false,条件成立输出flag

观察代码发现,最大回溯上限绕过preg_match

构造脚本

import requests
 
url = 'http://c7800bea-2a12-428d-b1d0-f2272162efa4.www.polarctf.com:8090/'
data = {
    'xdmtql': 'sys nb'+'very' * 250000
}
 
r = requests.post(url=url, data=data).text
print(r)

根据上面的分析,输出flag的条件是:POST传入、不能是数组、绕过preg_match函数、通过strpos函数

preg_match()绕过方法

数组绕过,即传入的参数为数组,此题不适用
利用PCRE回溯次数限制绕过:让回溯次数超过最大限制就可以使preg_match()函数返回false,从而绕过限制,中文的回溯次数在100万次就会崩溃,这个回溯保护使PHP为了防止关于正则表达式的DDOS
换行符绕过:.不会匹配换行符,所以使用%0a就可以绕过,此题不适应

swp即swap(交换分区)的简写,在编辑文件时产生,它是隐藏文件。这个文件是一个临时交换文件,用来备份缓冲区中的内容。类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。

如果文件正常退出,则此文件自动删除。如果并没有对文件进行修改,而只是读取文件,是不会产生swp文件的

简单rce

分析代码 要post传入一个yysd 再get一个sys

构造payload

passthru:PHP 中的一个函数,用于执行外部命令并直接将输出发送到浏览器PHP: passthru - Manualhttps://www.php.net/manual/zh/function.passthru.phpsort:此处的 sort 是排序命令,结合 passthru 执行系统命令,可能用于处理或提取 /flag 文件内容。需注意命令注入风险,并理解其在特定场景(如 CTF)中的实际用途。

PHP sort() 函数https://www.w3school.com.cn/php/func_array_sort.asp

PHP是世界上最好的语言

parse_str()函数用于把查询字符串解析到变量中,如果没有array参数,则由该函数设置的变量将覆盖已存在的同名变量,导致变量覆盖漏洞。

根据上述代码以及分析,可以知道

        要使第一个if为false,以及满足第二个if语句需要传入flag1和flag2并且值为8gen1
        要满足第三、第四个if,需要在POST传参504_SYS.COM和sys,并且sys的值需要绕过第四个if内的符号
        根据parse_str() 函数以及extract()函数,需要传入POST类的f l a g 1 和 flag1和flag1和flag2并且值为8gen1

我自己构造的payload 很显然不对 只好去看大佬写的 还是有差距的 但是起码我能看懂这个php了 以后还是要学点php基础

注:在php中变量名只有数字字母下划线,被get或者post传入的变量名,如果含有 空格 、 + 、[ 则会被转化为 _ ,但php中有个特性就是如果传入 [ ,它被转化为 _ 之后,后面的字符就会被保留下来不会被替换。

seek flag

前端就这样 什么也找不出来 看了源代码,作者担心被爬虫爬出来 我就去bp抓包看了一下 传了个id=1 出了前面一点点flag 我以为是要爆破 就开始爆破 发现从1到9999 只有id=1有东西 可能是思路错了

看了别人的教程 发现用direserach可以扫描到网址包含的文件 查看robots.txt  发现了flag3

   最后的flag2就藏在文件头里 没发现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值