根据源代码对应的功能猜测具体漏洞。
解决不了的问题–学会放弃,毕竟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: transition: all 0.4s 0.1s; } a:hover { background: 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
include 'config/conn.php';
$pageSize = 10;
if (isset($_GET['page'])||$_GET['page']=='') { $page = $_GET['page']; } else { $page = 1; }
$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 var_dump($_POST['submit']); if($_SERVER['REQUEST_METHOD']=='POST'){ $rou = $_FILES['file']; $allowedExts = array("gif", "jpeg", "jpg", "png"); 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 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
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); }
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); 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)); 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:
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>"; } 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
安全问题-后台验证:
- 用户登录逻辑安全问题 => SQL注入
- COOKIE和SESSION安全问题
- 验证码、万能密码安全问题 => 防爆破(不规范等于没用,例如被绕过)
验证码存在的问题: 验证码复用,验证码第一次输入后续不再输入
完整的验证: 每次登陆/刷新页面验证码都要改变
实战验证: 输入正确的验证码抓包,在重发器测试验证码不改变的情况下掉密码,看验证码是不是会提示错误 提示错误则表示验证码没问题
验证码识别: 有插件实现,可针对那些非动作类的,一般是薅羊毛的人批量注册搞的
|