bugku1&攻防世界

web8

img

就给了个这个 啥也无,所以就要想该如何获得flag, 我们看到
$_REQUEST()函数 他既可以接受get也可以接收post数据,所以 在这里,他的意思是获得一个hello的数据,所以我们就需要所以 我们在URL里面输入的时候就需要输入?hello=多少 然后这个多少会被代入到eval里面执行
而我们对eval这个函数也不陌生了,他是将你输入的字符串转化为PHP代码来执行,但是两段命令之间需要用分号来隔开,而在这题中,他的flag似乎是包含在flag.php的文件夹中的,要获取flag就需要输出这个文件夹的内容:
构建payload:http://114.67.246.176:10770/?hello=1);print_r(file("./flag.php")
为什么可以使用print_r和var_dump而不使用echo呢?
原因:前两个还可以输出复杂的数组类型 而echo仅能输出变量或字符串

12.18日看完黑盾被赛前培训思考:

web9

img 在这题当中,我们看了一下代码 首先用了一个正则表达式,意思是如果在提交上来的值中包含不是字母或者数字的东西,将会被args error,那么我们在看下面img 资料来源:https://blog.csdn.net/anjiaowangmenghan/article/details/76460872 所以我们可以知道当有两个$$的时候 第一个是为$args 假设我们让$args=as 那么最终就会变成 $as 那么就会执行$**这个变量所表示的值,那么再本题中,我们可以就可以利用这点,让他执行一个全局数组变量,也就是$GLOBALS

$GLOBALS **
— 引用全局作用域中可用的全部变量
**说明

一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
注意: 变量可用性与所有其他超全局变量不同,$GLOBALS在PHP中总是可用的。
所以当我们调用$GLOBALS的时候,输出的将会是所有数组
构建payload:
http://114.67.246.176:11872/?args=GLOBALS
img

好的这样就行了

web11

是否留下后门?
要看是否留下后门我们要从哪里突破?根据那个教学视频,我们可以看看这个网站的网站目录
看看有没有其他目录,这个时候我们就使用到一个叫做御剑的软件,是一个后台网站爆破的软件
img
可以看到 它是由一个shell.php的网站的,那么这个时候我们打开一下这个shell.php试试
img

他需要我们输入PASS 这个时候我们可以直接用burp suit进行暴力破解即可
PS:index.php 主体网站

web12

img
在查看网页源代码的时候发现了这个 一个好像是经过加密的东西 然后我就去解码,发现是base64的编码,然后解码完后是test123 然后再看网页
img
是需要我们输入管理员的账号和密码的,然后我们盲猜一波账号是admin 密码是这个试试

但是他一直说IP禁止访问,然后查了一下资料说是要用伪造一个XFF进行登录
img
大概是这样的
问题1:XFF是什么
XFF是header请求头中的一个参数
是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。
代表了HTTP的请求端真实的IP。

问题2:为什么看到IP被禁止可以想到伪造XFF?
IP被禁止了,我们想要继续访问,可以通过伪造XFF来绕过服务器ip的过滤进行访问

web13

正常用LFI去读/sqli/db.php文件 是无法读取它的源码 它会被当做php文件被执行img

将只会输出结果 这个时候我们就可以使用php://filter
构造payload:?file=php://filter/read=convert.base64-encode/resource=index.php

php://filter
在PHP官网上的解释是:
它是一种元封装器,设计用于数据流打开时的筛选过滤应用。这对于一体式的文件函数非常有用,类似readfile()、file()和file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器
php://filter目标使用以下的参数作为它路径的一部分。复合过滤链能够在一个路径上指定。
img

筛选过滤应用:

1、 字符串过滤器:

  • string.rot13 对字符串执行ROT13转换
  • string.toupper转换为大写
  • string.tolower 转换为小写
  • string.strip_tags去除html和php标记

2、 转换过滤器:

  • convert.base64-encode & convert.base64-decode :**base64编码和解码**
  • convert.quoted-printable-encode & convert.quoted-printable-decode**:**将 quoted-printable 字符串转换为 8-bit 字符串

3、 压缩过滤器:

  • zlib.deflate**和** zlib.inflate
  • bzip2.compress**和** bzip2.decompress

4、 加密过滤器:

不显示报错信息
strstr()函数:
strstr(string,search,before_search)
img
资料来源:https://www.runoob.com/php/func-string-strstr.html
所以我们可以知道
img

这句话的意思是 从提交上来的url字符串中搜索, 搜索?以后的内容,所以$str=?=…..

substr()函数这个函数我们之前已经遇到过了,但是上一次没有学清楚我觉得
img

语法:substr(string,start,length)
img
所以说 在这句话中它的意思是返回从第一个字符开始往后的内容
所以我们最后这个substr==。。。。。
然后是
img

srt_replace就是一个正则替换吧 他的意思是吧key换成无值
**parse_str()**函数
语法:parse_str(string,array)’//后面的array可不选,选了以后意思是将string中的字符串数组变量存储到定义的array这个数组当中
他的作用是将查询字符串解析到变量中
举个例子吧
parse_str(“name=hh&age=18”);
echo $name;
echo $age; 这样的结果是 hh 和18;

那么这题究竟什么意思呢?

1
2
3
4
5
6
7
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>

他的意思就是 我输入两个key 在经过去掉问号去掉key以后 如果两个的md5值相等,但是两个key本身不相等那就输出flag
所以我需要找两个MD5值相等的字符串:
思路1.如果两个字符经MD5加密后的值为 0exxxxx形式,就会被认为是科学计数法,且表示的是0*10的xxxx次方,还是零,都是相等的。(也就是我使用的方法)

下列的字符串的MD5值都是0e开头的:

QNKCDZO

240610708

s878926199a

s155964671a

s214587387a

s214587387a
index.php?kekeyy1=QNKCDZO&kekeyy2=240610708

2.md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。
所以可以输入:http://120.24.86.145:8002/web16/index.php?kekeyy1[]=something&kekeyy2[]=anything
资料来源:https://www.cnblogs.com/yuluoluo/p/9782327.html

web-php-include

文件包含漏洞

文件包含简介:
服务器执行PHP代码的时候,可以通过文件包含函数加载另一个文件夹中的PHP代码,并且当PHP来执行
,这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。
文件包含函数
require()
require_once()
include()
include_once()

includerequire区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。而include_once()require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。

漏洞产生原因:
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。

1
2
3
4
<?php    
$filename = $_GET['filename'];
include($filename);
?>

例如:
$_GET['filename']参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改$_GET['filename']的值,执行非预期的操作。

漏洞分类:

本地文件包含漏洞

1.无限制本地文件包含漏洞
2.session文件包含漏洞
3.有限制本地文件包含漏洞绕过

远程文件包含漏洞

1.无限制远程文件包含漏洞
2有限制远程文件包含漏洞绕过
3.问号井号绕过

参考资料:https://www.freebuf.com/news/182280.html

img

分析源码:
show source()展示文件,文本中高亮的部分
include(),加载$page这个变量当中所指向的文件夹中的代码
str_replace:正则替换,过滤掉php://
strstr():前面遇过,就是搜素
所以代码是这样的,输出的是hello参数,而被加载文件文本代码的是$page变量中的内容
思路:我们的思路是,让$page所得到的内容经由hello显示出来

在看黑盾杯的教学视频中
实在不懂为啥可以?page=http://127.0.0.1/index.php/?hello=
所以就先跳过这个方法吧。
方法一
使用php://input封装协议
感觉这个思想挺巧妙的,这个php://input可以让page读取我们用post上传的文件(我们写一段完整代码也是一个文件
然后因为这边有过滤,所以我们就可以使用那几钟绕过方式这边使用大小写绕过:我无语了 粘贴复制画面都无反应感觉很多代码都没陌生,我认为还是继续去刷upload-labs吧,后面多学点再来补充吧

web20:

打开网页,是一串字母,看着不像被加密过的
再看看URL

1
?line=&filename=a2V5cy50eHQ=

a2V5cy50eHQ=像是被base64加密过得
解码后得:keys.txt
用御剑扫描后台发现有keys.txt

img 推测可得,网页存在文件包含漏洞 ?line代表的是行数 默认是第一行 后面的filename是文件名,接下来就是尝试了: 读取一下index.php文件试试,先将其用base64进行编码,然后输入到url中,在一行行查看代码中,我们发现在后面有说一个
1
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin')

,就可以看keys.php,那么让我们伪造试试

img 好的成功

web21

查看网页源码,感觉没啥,然后只能看看有什么信息能利用,使用御剑,看看有没有其他后台,发现没有收获,看了下题解,网页源码有一个1p.html,直接访问,发现会跳转,可以推测出其源码有href属性,然后直接
view-source:http://114.67.246.176:16013/1p.html,
使用view-source前缀
即可直接查看网页源码,发现script使用了urlcode,经过解码,是

1
<script> href="URL"</script>

再看后面,又是base64加密,解码以后得到urlcode加密,然后再解码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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)
{
$flag = "flag{***********}"
}
else
{
print "never never never give up !!!";
}
?>

得到以上代码,让我们康康这段代码写了啥

看看他这几个判断,首先是id为空则直接跳转一下连接,非空则不执行
接下来她会get获取id a b 三个变量的值,如果a当中有‘.’那么将会直接执行那个判断语句,

file_get_contents — 将整个文件读入一个字符串,这里指的是将$a所定义的文件读入一个字符串,
所以这里就是一个考点,不让我们直接导入文件,但是又需要读取文件,想到直前的php:/input
然后在下面写一个post:bugku is a nice plateform
再往下就是拿到flag的限制条件了:
我们先来看a吧
eregi(a,b,c)函数:
在b中寻找a,如果有匹配到,就将匹配项给c
在这题中,只有两个参数那个点要注意看!!是连接符,不是逗号,所以这里的意思是111和b的第一个字符进行连接,并和1114进行匹配,且b的第一个字符不能为4,长度要大于5
搜索知道

ereg和eregi的截断漏洞:

①%00截断及遇到%00则默认为字符串的结束
②当ntf为数组时它的返回值不是FALSE

这里我们使用第一个漏洞

接下来就是id了,id他说要非空非零后面弱类型比较又要等于0,我们就去找找有没有松散比较的类型:
img
从这个图我们知道,字符串和0是弱相等的,所以:
img
综合以上即可得到flag

Author

vague huang

Posted on

2020-12-15

Updated on

2021-01-31

Licensed under

Comments