RCE(远程代码执行)
Ping
我们尝试写入一个IP地址,比如127.0.0.1(本机的回环地址)
、
接下来我们尝试和IP进行拼接查询语句,比如whoami,net user ,netstat -an 等等
这样九爆出了用户名,接下来我们看看源代码,以下是主要的一段代码
if(isset($_POST['submit']) && $_POST['ipaddress']!=null){
$ip=$_POST['ipaddress'];
// $check=explode('.', $ip);可以先拆分,然后校验数字以范围,第一位和第四位1-255,中间两位0-255
if(stristr(php_uname('s'), 'windows')){//判断操作系统的是windows还是linux
// var_dump(php_uname('s'));
$result.=shell_exec('ping '.$ip);//直接将变量拼接进来,没做处理
}else {
$result.=shell_exec('ping -c 4 '.$ip);
}
}
主要的问题是他没有对用户的输入进行任何的过滤,才会出现远程代码执行的漏洞
eval
看一下提示说后台执行eval函数,所以我们尝试执行php代码中的phpinfo函数
成功了,在这里小编提醒一下payload是下面这个,记得加分号因为eval里是执行的php代码
,php代码每一行结束都有分号
payload:phpinfo();
不理解php函数的看这个PHP代码审计-CSDN博客
PHP反序列化
让我们填写一个序列化之后的东西
<?php
class S{
var $test = "pikachu";
function __construct(){
echo $this->test;
}
}
//O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
$html='';
if(isset($_POST['o'])){
$s = $_POST['o'];
if(!@$unser = unserialize($s)){
$html.="<p>大兄弟,来点劲爆点儿的!</p>";
}
else{
$html.="<p>{$unser->test}</p>";
}
}
?>
这里可以直接去反序列化,下面是php构造序列化的代码
<?php
class S{
var $test = "<script>alert('xss')</script>";
}
$a = new S();
$b = serialize($a);
echo $b;
?>
Unsafe Fileupload
client check
看一下提示,可以大概了解到大概是前端的绕过
我们看一下代码,我们可以看到是前端的js代码绕过,所以我们直接禁用js就ok了
<script>
function checkFileExt(filename)
{
var flag = false; //状态
var arr = ["jpg","png","gif"];
//取出上传文件的扩展名
var index = filename.lastIndexOf(".");
var ext = filename.substr(index+1);
//比较
for(var i=0;i<arr.length;i++)
{
if(ext == arr[i])
{
flag = true; //一旦找到合适的,立即退出循环
break;
}
}
//条件判断
if(!flag)
{
alert("上传的文件不符合要求,请重新选择!");
location.reload(true);
}
}
</script>
先按F12在按F1,往下翻就可以看到,勾选,直接上传一句话木马
上传成功
Mime type
直接看源代码
if(isset($_POST['submit'])){
// var_dump($_FILES);
$mime=array('image/jpg','image/jpeg','image/png');//指定MIME类型,这里只是对MIME类型做了判断。
$save_path='uploads';//指定在当前目录建立一个目录
$upload=upload_sick('uploadfile',$mime,$save_path);//调用函数
if($upload['return']){
$html.="<p class='notice'>文件上传成功</p><p class='notice'>文件保存的路径为:{$upload['new_path']}</p>";
}else{
$html.="<p class=notice>{$upload['error']}</p>";
}
}
这里和上面的差不多,只不过时进行了后端的验证,检验了文件的类型,并没有检查后缀
所以我们直接BP抓包,把文件类型进行更改那三个中的一个就行
getimagesize
这一关我们可以使用图片马,图片马制作方法有很多
这一关,我们怎么制作图片马呢,我们上传一个正常的图片并用bp抓包
中间这串乱码就是我们图片的内容
我们可以往下翻,直接把一句话木马写在这里
注意不要写在文件头部,这里会对文件头进行检测,看看是不是图片类型
放包,上传成功
Unsafe Filedownload
直接更改filename ,,/为了返回到根目录,直接下载成功
敏感信息泄露
直接查看源带代码
成功登录
暴力破解
基于表单的暴力破解
直接进行抓包
添加payload
配置payload
可一看到当账户为admin密码为password的时候长度不一样139和138因为代码加了一点东西
验证码绕过(on server)
我们发现,只有当页面刷新时,验证码才会重新刷新,下面我们就来验证一下这个猜想
我们先来抓一个包,输入正确的验证码和错误的账号密码
再次修改密码,不改动验证码
依旧提示username or password is not exists,由此验证我们的猜想是对的,只要页面不刷新,验证码就不会改变。
呢么剩下的步骤就和上一关一样了,我们将数据包发送到攻击模块,暴力破解
验证码绕过(on client)
查看源码,发现是前端的过滤,直接关掉js就可以
这样我们就绕过前端验证了
后面的步骤和前两关一样,也是bp抓包,爆破账号密码
token防爆破?
token的作用:简单来说就是服务器给前端发的身份证,前端向服务器发送请求时都要带上这个身份证,服务器通过这个身份证来判断是否是合法请求
在账户,密码和token都添加payload,配置字典,token的字典配置
将token的payload类型设置成递归搜索,在递归搜索选项中的第一个请求的初始有效负载
设置为之前复制的token
攻击成功
Cross-Site Scripting(xss)
反射型xss(get)
构造payload
<script>alert('xss')</script>
反射型xss(post)
我们发现一个登录框,我们在暴力破解那一关,获取到了管理员账号和密码,即
账号:admin
密码:123456
如果没做暴力破解我们也可以点一下提示看一下
存储型xss
我们先看一下post和get请求的区别
数据传输方式:
GET请求:数据通过URL中的查询参数附加在URL后面,以明文形式传输数据。
POST请求:数据作为请求的正文发送,而不是通过URL传递。
数据长度限制:
GET请求:有长度限制,受浏览器和服务器对URL长度的限制。
POST请求:没有固定的长度限制,适合传输大量数据。
数据安全性:
GET请求:数据以明文形式暴露在URL中,容易被窃听和拦截。
POST请求:数据在请求正文中传输,并可以使用加密协议(如HTTPS)进行传输,相对更安全。
数据缓存:
GET请求:可以被浏览器缓存,可以提高性能。
POST请求:通常不被浏览器缓存。
仔细观察就会发现,get型的那一关,我们输入的payload在url中有显示,而post则没有显示
把页面重新转回来发现还会弹窗,这就是储存型的
DOM型xss
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see</a>";
}
</script>
我们可以直接利用js的伪协议在str这拼接
点一下what do you see?即可弹窗
DOM型xss_x
和上一关差不多只是多了一个链接
点击第二个链接,第一个链接就会出现,再点击第一个即可弹窗
xss盲打
这一关是什么意思呢,盲打也就是我们在前端并不能看到我们的代码,无法判断xss是否成功,只有在后台才能看到
成功弹窗,并且弹了两次,也就是说两个输入框都有xss漏洞
xss之过滤
if(isset($_GET['submit']) && $_GET['message'] != null){
//这里会使用正则对<script进行替换为空,也就是过滤掉
$message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);
// $message=str_ireplace('<script>',$_GET['message']);
if($message == 'yes'){
$html.="<p>那就去人民广场一个人坐一会儿吧!</p>";
}else{
$html.="<p>别说这些'{$message}'的话,不要怕,就是干!</p>";
}
}
这关可以看到他把<script全部给过滤了,所以伪协议也用不了了
换程<a οnclick="alert('xss')">
xss之htmlspecialchars
if(isset($_GET['submit'])){
if(empty($_GET['message'])){
$html.="<p class='notice'>输入点啥吧!</p>";
}else {
//使用了htmlspecialchars进行处理,是不是就没问题了呢,htmlspecialchars默认不对'处理
$message=htmlspecialchars($_GET['message']);
$html1.="<p class='notice'>你的输入已经被记录:</p>";
//输入的内容被处理后输出到了input标签的value属性里面,试试:' onclick='alert(111)'
// $html2.="<input class='input' type='text' name='inputvalue' readonly='readonly' value='{$message}' style='margin-left:120px;display:block;background-color:#c0c0c0;border-style:none;'/>";
$html2.="<a href='{$message}'>{$message}</a>";
}
}
一般的html实体转义没有注入的,但是这个message的位置在href内,就可以js的伪协议进行注入
如果这关加上了过滤了script,可以尝试进行unicode编码,因为href属性自带unicode解码
xss之href输出
if(isset($_GET['submit'])){
if(empty($_GET['message'])){
$html.="<p class='notice'>叫你输入个url,你咋不听?</p>";
}
if($_GET['message'] == 'www.baidu.com'){
$html.="<p class='notice'>我靠,我真想不到你是这样的一个人</p>";
}else {
//输出在a标签的href属性里面,可以使用javascript协议来执行js
//防御:只允许http,https,其次在进行htmlspecialchars处理
$message=htmlspecialchars($_GET['message'],ENT_QUOTES);
$html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";
}
}
和上一关一样
xss之js输出
<script>
$ms='<?php echo $jsvar;?>';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
</script>
直接闭合script标签就可以了
</script><script>alert('xss')</script>
file inclusion
本地文件包含
我们可以尝试修改filename后的文件名读取其他的文件
?filename=C:/../../../../Windows\win.ini&submit=提交查询
远程文件包含
这一关和上一关有什么不同,这一关我们可以访问远程服务器上的文件
比如这里我们访问百度
呢么有什么用呢,我们可以在自己服务器上写一个木马文件,在这里远程包含我们的木马文件,然后通过我们的webshell管理工具进行连接,以此来getshell
目录遍历
?title=C:../../../../../../windows\win.ini
不安全的URL跳转
这几个超链接我们都点一点,当点到“我就是我,放荡不羁的我”时,发现url地址栏中出现了url参数
?url=http://www.baidu.com