根据源代码对应的功能猜测具体漏洞。
解决不了的问题–学会放弃,毕竟WAF不是能随便绕的。

PHP开发-分页读取文件条目

知识点:

1、PHP入门-语法&提交等
2、MYSQL入门-数据库操作
3、HTML+CSS入门-样式编排

安全向:SQL注入。=>通过功能去找注入点。

实现功能:

前端文章导航,点入内容显示,更改ID显示不同内容

前台显示文章,后台添加文章。

文章阅读,留言板,会员中心,模板风格引入……
登录验证,文章增删改查,配置修改……
php代码和html代码混编执行。

实现步骤:

php配置文件有:index.php,news.php,conn.php

index:主页文件
news:新闻模块
conn:数据库连接文件

index.php

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>测试</title>
</head>

<body>
<style>
li {
list-style: none;
display: inline-block;
}
a {
display: inline-block;
width: 100px;
height: 40px;
text-align: center;
line-height: 40px;
background: red;
text-decoration: none;
color: #fff;
transition: all 0.4s 0.1s;
}
a:hover {
background: #b60000;
color: yellow;
}
</style>
<ul>
<li><a href="index.php">首页</a></li>
<li><a href="news.php">新闻</a></li>
<li><a href="#">公司产品</a></li>
<li><a href="#">关于我们</a></li>
<li><a href="#">公司介绍</a></li>
</ul>
</body>

</html>

news.php

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>暗网新闻</title>
</head>

<body>
<h1>欢迎来到新闻模块</h1>

</body>

</html>
<?php
# 包含文件的操作,相当于调用某个php文件
include 'config/conn.php';

// 定义每页显示的条数
$pageSize = 10;

// 定义当前页,通过地址栏传参得到$page参数来定义当前页
if (isset($_GET['page'])||$_GET['page']=='') {
$page = $_GET['page'];
} else {
$page = 1;
}

// 根据公式计算limit需要的第一个参数
$start = ($page - 1) * $pageSize;

# 数据库查询语句
$sql0 = 'select * from wordimg';
$max_num = mysqli_num_rows(mysqli_query($conn,$sql0));
$sql = "select * from wordimg LIMIT $start ,$pageSize;";
# 数据库语句执行
$w = mysqli_query( $conn,$sql);
# 获得执行结果的数组
$list = mysqli_fetch_all($w);


# 输出内容
foreach ($list as $key=>$value){
echo "<h3>$value[0]</h3><p>$value[1]</p>";
}
$up = max(1, $page - 1);
$next = $page + 1;
$next = ($max_num/10) < $next ? ($max_num/10) : $next;
echo "<a href='?page=$up'>上一页</a>";
echo "<a href='?page=$next'>下一页</a>";

conn.php

<?php
$dbid = '127.0.0.1';
$dbna = 'root';
$dbpd = '123456';
$dbda = 'phpopen';
$conn = mysqli_connect($dbid,$dbna,$dbpd,$dbda);

PHP开发-文件下载/删除/读取/写入

知识点

1、文件操作类代码编写
2、文件上传&下载&删除
3、文件内容&读取&写入
4、第三方编辑器引用实例

各个类型

文件上传类:-任意文件上传

1、代码自主写–源码

// 表单
<form action="file_upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" name="submit" value="提交">
</form>

// PHP
<?php
var_dump($_POST['submit']);
if($_SERVER['REQUEST_METHOD']=='POST'){
$rou = $_FILES['file'];
$allowedExts = array("gif", "jpeg", "jpg", "png");
# 文件后缀名拆分
# $temp = explode(".", $_FILES["file"]["name"]);

if (isset($rou)){
$err = $rou['error'];
if (!($err>0)){
$type = $rou['type'];
$allowedExts = array("gif", "jpeg", "jpg", "png");
$w = 0;

foreach ($allowedExts as $key=>$val){
if ('image/'.$val==$type){
$w++;
$size = $rou['size'];
if($size>100){
echo "大文件正在上传当中!";
$path = './f';
$tmpname = $rou['tmp_name'];
$filename = $rou['name'];
$x = move_uploaded_file($tmpname,"$path/$filename");
echo $x?"上传成功":"上传失败";
} else {
echo "文件太小啦!";
}
}
}

if ($w==0){
echo "文件类型有误!";
}
echo $w;
} else {
echo "您的传入有误";
}
}
}

2、编辑器引用–调用插件插入网站

编辑器自身的漏洞会影响到网站,核心代码在编辑器自身,而不是源代码。

简单来说,源码再安全,也顶不住插件釜底抽薪。
验证的核心在插件上。

3、框架类文件上传(暂略)

调用别人封装好的代码自己进行编译,关键点在于框架本身,有漏洞后也挡不住这种第三方捅娄子。

验证的核心在框架上。

文件下载类:-任意文件下载

1、直连URL访问

利用网站无法解析对应的文件进行文件下载,如果是php文件就是直接执行php文件了
形如:xiaodi8.com/file.zip
可以调用herf进行下载

2、传参头部修改

形如:xiaodi8.com/index.php?filename=file.zip

源码泄露后有任意文件下载风险。

<h1>Downlond </h1>
// 两种A标签直链
<a href="./f/caidao.exe">点击下载文件</a>
<a href="?filename=caidao.exe">点击下载文件</a>
// 表单处理变量的直链下载
<form action="file_down.php" method="post">
<h4>选择性下载文件</h4>
<input type="text" name="file">
<input type="submit" name="点击下载">
</form>

<?php
# 下载方式1:直连地址下载
if ($_SERVER["REQUEST_METHOD"]=="POST"){
$name = $_POST['file'];
geturl($name);
}
function geturl($name){
$url = "http://".$_SERVER['HTTP_HOST']."/file/f/".$name;
echo $url;
header("Location: ".$url);
}

#下载方式2:传参下载
if ($_SERVER['REQUEST_METHOD']=='GET'){
$file_name = isset($_GET['filename'])?$_GET['filename']:''; // 下载时的文件名,可以和实际文件名不同
$file_path = '/f/'.$file_name; // 文件路径
#防自动执行和无参报错
if (isset($_GET['filename'])){
if ($_GET['filename']!=''||$_GET['filename']!=null){
// 打开文件
$file = fopen($file_path, 'rb');
// 下载文件的大小
$file_size = filesize($file_path);
// 设置 HTTP 响应头信息,告诉浏览器将要输出一个文件流
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=$file_name");
header("Content-Length: $file_size");
// 循环读取文件并输出给浏览器
while (!feof($file)) {
print(fread($file, 1024 * 8)); // 每次输出 8KB
ob_flush();
flush(); // 将缓冲区的内容送到浏览器
}
fclose($file);
}
}
}

文件删除类-任意文件删除

1、文件删除
2、文件夹删除

// 任意文件删除:高危漏洞

<h5>文件删除</h5>
<form action="file_del.php" method="post">
需要删除的文件/文件夹:<input type="text" name="file">
<input type="submit" name="submit" value="删除">
</form>
<?php
if ($_SERVER["REQUEST_METHOD"]=="POST"){
$file = "./f/".$_POST['file'];
if (isset($_POST['file'])){
echo "删除开始……<br>";
if(file_exists("$file")){
echo "路径信息有误<br>";
}
deleteDir($file);
}
}

function deleteDir($dirPath) {
echo ''.$dirPath.'<br>';
if (is_file($dirPath)) {
unlink($dirPath);
}else if (is_dir($dirPath)) {
$dirPath = $dirPath.'/';
#删文件夹下的文件
$files = array_diff(scandir($dirPath),array(".",'..'));
$hd=opendir($dirPath);
while(($file_name=readdir($hd))!==false){

if ($file_name!='.'&&$file_name!='..') {
$file_path = "$dirPath$file_name";
deleteDir($file_path);
}
}
closedir($hd);
# 删除文件夹本身
@rmdir($dirPath);

}
}


文件内容操作类-任意文件读取&写入

1、文件读取
2、文件写入

<style>
textarea {
width: 500px;
height: 600px;
resize: none;
}
</style>
<?php
$x = '';
$path = '';
if ($_SERVER['REQUEST_METHOD']=="POST"){
if (isset($_POST['path'])){
$path = './f/'.$_POST['path'];
$x = file_get_contents('./f/'.$_POST['path']);
}
if (isset($_POST['text'])){
$p = $_POST['p'];
$c = $_POST['text'];
file_put_contents($p,$c);
}
}
?>

<form action="file_rw.php" method="post">
读取指定文件:<input type="text" name="path">
<input type="submit" value="读取">
</form>

<form action="file_rw.php" method="post">
<input type="hidden" name="p" value=<?php echo $path;?> >
<textarea name="text"><?php echo $x?></textarea>
<input type="submit" name="submit" value="修改">
</form>

文件包含-任意文件包含

概念

1、本地文件包含
2、远程文件包含

文件包含:包含即执行,脚本执行

函数会执行1.txt里面的php代码
include(1.txt);

形如:
url: http://www.baidu.com/index.php?path=flag.php

index.php内:
include($_GET['path']);

这就是包含执行。假如传入的flag.php为后门,就变成了一个文件包含漏洞。

文件包含函数:

require() // 只在执行到此函数时才去包含文件,若包含的文件不存在产生警告,程序继续运行

require_once() // 如果一个文件已经被包含过,则不会在包含它

include() // 程序一运行文件便会包含进来,若包含文件不存在产生致命错误,程序终止运行

include_once() // 如果一个文件已经被包含过,则不会在包含它

Web漏洞核心:

1、可控变量 - 变量修改与拼接
2、特定函数 - 函数的多样化 - 常见函数漏洞绕过等

直链地址无法更改的原因:不是变量

PHP开发-输入输出留言板访问获取

知识点:

1、PHP-全局变量$_SERVER
2、MYSQL-插入语法INSERT
3、输入输出-XSS&反射&存储
4、安全问题-XSS跨站&CSRF等

PHP本地搜索

可以传入JS,利用JS进行攻击。

<form action="file.php" meathod="post">
<input type="text" name="word">
<input type="submit" value="搜索">
</form>


<?php
// 数据库文件包含
include "conn.php";

$s = $_POST['word'];
$sql = "select * form Tablename where word_title like '%$s%' "
$list_value = mysqli_quake($conn,$sql);
if($list_value){
echo "你搜索的$s结果如下:";
echo "<ul>";
$list mysqli_fetch_all($list_value);
foreach($list as $k=>$v){
echo "<li>用户:$v[0]<p>内容:$v[1]</p></li>"; # 插入点:当提交的文件内容带有js代码块时,每次读取一次数据库内容就执行一次代码。
}
echo "</ul>";
}else {
echo "暂无与$s相关的搜索结果!";
}
?>

跨站漏洞:你输入的内容控制网站内容的显示
应用:留言板
XSS跨站脚本攻击

// 加载前面的留言内容
// 可以提交留言 => 插入数据
// 提交留言后会再加载

// 留言存储的地方:存入数据库当中

存储型:脚本存储到数据库或者存储到可以被执行的地方(安全问题出处)
反射型:


# 功能性质发现漏洞的方式:寻找能控制页面输出内容的地方(对应的那些功能控件)
黑盒安全问题:
接收你的值的输入,又会将你的值输出 => 对应XSS


相关PHP函数:$_SERVER
根据目标的功能决定漏洞,
功能越多漏洞越多,功能越少漏洞越少
CSRF请求伪造
来源伪造CSRF
XFF伪造绕过的是PHP检测的,如果是服务器自身的检测不走PHP的,就伪造不了了

PHP开发-COOKIE/SESSION/TOKEN

都是用于身份验证的,但略有区别

COOKIE:存储到客户端 => COOKIE被盗取时导致信息泄露/任意条件绕过
SESSION:存储到服务器 => 会话劫持,未失效时才能有效使用(它是动态变换的,有时效性)
TOKEN:唯一的身份认证 => 唯一的标志,利用各种算法来生成这个字符串

具体实例:SEC-2023版学习-0029

安全问题-后台验证:

  1. 用户登录逻辑安全问题 => SQL注入
  2. COOKIE和SESSION安全问题
  3. 验证码、万能密码安全问题 => 防爆破(不规范等于没用,例如被绕过)
验证码存在的问题:
验证码复用,验证码第一次输入后续不再输入

完整的验证:
每次登陆/刷新页面验证码都要改变

实战验证:
输入正确的验证码抓包,在重发器测试验证码不改变的情况下掉密码,看验证码是不是会提示错误
提示错误则表示验证码没问题

验证码识别:
有插件实现,可针对那些非动作类的,一般是薅羊毛的人批量注册搞的