XSS漏洞
反射型 XSS 漏洞
它通过给别人发送带有恶意脚本代码参数的 URL,当 URL 地址被打开时,特有的恶意代码参数被 HTML 解析、执行。它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。
变量直接输出
<?php $xss = $_GET['xss']; echo $xss; ?>
$_SERVER 变量参数 输出
$_SERVER['PHP_SELF'] $_SERVER['HTTP_USER_AGENT'] --> User-Agent $_SERVER['HTTP_REFERER'] --> Referer $_SERVER['REQUEST_URI'] <?php // echo $_SERVER['PHP_SELF']; // echo $_SERVER['HTTP_USER_AGENT']; // echo $_SERVER['HTTP_REFERER']; echo urldecode($_SERVER['REQUEST_URI']); ?>
$_SERVER['PHP_SELF']
输入什么字符 返回什么字符
构造payload
$_SERVER['HTTP_USER_AGENT']
打开插件 添加user-agent
$_SERVER['HTTP_REFERER']
$_SERVER['REQUEST_URI']
变量前加上urldecode才可以弹窗 默认把特殊符合进行url编码
存储型 XSS 漏洞
持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种 XSS 比较危险,容易造成蠕虫,盗窃 cookie 等。
审计 sql 语句主要是 update insert 更新和插入语句内容输入输出没有被过滤或者过滤不严!
退出 再次点击 则又会弹出
查看数据库 可以看到payload
CSRF漏洞
攻击者盗用了你的身份信息,以你的名义发送恶意请求。 以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账等 造成的问题包括:个人隐私泄露以及财产安全。
漏洞本质
攻击者获取到重要的参数,成功构造一个伪造请求 http://www.xxx.com/money.php?count=3&id=1000
思路
后台功能模块:管理后台、会员中心、添加用户等 被引用的核心文件里面有没有验证token和referer相关的代码 没带token:可以直接请求这个页面 没带referer:返回相同的数据 目标存在CSRF漏洞 受害者需要保持目标站点的活跃状态 受害者需要点击钓鱼链接
pikachu 使用lucy登录 然后修改地址
使用burp在抓包 更改地址
恶意的url
http://192.168.0.9/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=110&add=hacker&email=lucy%40pikachu.com&submit=submit
POST请求 伪造poc html
<?php mysql_connect("localhost","root","123456"); mysql_select_db("admin"); mysql_query("set names gbk"); if (!isset($_POST['sub'])){ $name = $_POST['name']; $pass = $_POST['pass']; $sql = "INSERT INTO `user` (`id`,`name`,`pass`) VALUES (NULL ,`$name`,`$pass`)"; if ($row=mysql_query($sql)){ echo "ok"; } else{ echo "no"; } } else{ $sql = "select * from user"; if($row=mysql_query($sql)){ while($row=mysql_fetch_array($row)){ echo "name: {$rows[name]} pass: {$rows[pass]}<br>"; } } } ?> <from action="" method="post"> name:<input type="text" name="name"><br> pass:<input type="password" name="pass"><br> <input type="submit" value="ok" name="sub"> </from> <script> function a() { document.getElementById('tt').submit(); } </script> <body onload=a()> <form action="http://127.0.0.1/test.php" method="post" id="tt"> <input type="hidden" name="name" value="test"> <input type="hidden" name="pass" value="test123"> <input type="hidden" name="sub" value="123456"> </form> </body>
文件上传漏洞
上传文件的时,服务器端脚本语言未对上传的文件进行严格的验证和过滤,就有可能上传恶意的文件,从而控制整个网站,甚至是服务器。
条件
文件可上传知道文件上传的路径上传文件可以被访问上传文件可以被执行
文件上传可控点
Content-Length,即上传内容大小 MAX_FILE_SIZE,即上传内容的最大长度 filename,即上传文件名 Content-Type,即上传文件类型 请求包中的乱码字段,即是所上传文件的内容 有可能存在请求包中的可控点还有上传路径,只是上面的示例中没有出现
思路
上传点都调用同一个上传类,直接全局搜索上传函数 黑盒寻找上传点,代码定位
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文件上传</title> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" name="上传文件"> </form> </body> </html> <?php header("Content-Type:text/html;charset=utf-8"); if ($_FILES["file"]["error"] > 0) { echo "错误:" . $_FILES["file"]["error"] . "<br>"; } else { echo "上传文件名: " . $_FILES["file"]["name"] . "<br>"; echo "文件类型: " . $_FILES["file"]["type"] . "<br>"; echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>"; echo "文件临时存储的位置: " . $_FILES["file"]["name"]; } ?>
目录穿越
目录穿越(Directory Traversal)攻击是黑客能够在Web应用程序所在的根目录以外的文件夹上,任意地存取被限制的文件夹、执行命令或查找数据。目录穿越攻击,也有人称为Path Traversal攻击。
危害
攻击者可以使用目录穿越攻击来查找、执行或存取Web应用程序所在的根目录以外的文件夹。如果目录穿越攻击成功,黑客就可以执行破坏性的命令来攻击网站
<?php $file = $_GET['file']; readfile($file); ?>
文件包含
文件包含漏洞的产生原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。当被包含的文件在服务器本地时,就形成的本地文件包含漏洞,被包涵的文件在第三方服务是,就形成了远程文件包含漏洞。
危害
执行恶意代码包含恶意文件控制网站甚至控制网站服务器等
思路
模块加载、cache调用,传入的参数拼接包含路径 include() 使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。 inclue_once() 功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。 require() 使用此函数,只要程序执行,立即调用此函数包含文件,发生错误时,会输出错误信息并 立即终止程序。 require_once() 功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。 <?php $filename=$_GET['filename']; include($filename); ?>
本地包含
远程包含
任意文件读取漏洞
通过提交专门设计的输入,攻击者就可以在被访问的文件系统中读取或写入任意内容,往往能够使攻击者从服务器上获取敏感信息文件,正常读取的文件没有经过校验或者不严格,用户可以控制这个变量读取任意文件思路
fopen() file_get_contents() fread fgets fgetss file fpassthru parse_ini_file readfile <meta charset="UTF-8"> <?php $filename = $_GET['file']; if(isset($_GET['file'])) { // $fp = fopen($filename,"r") or die("无法读取文件"); // $data = fread($fp); echo file_get_contents("$filename"); }else{ echo '<h1>任意文件读取</h1>'; }
任意文件删除漏洞
攻击者从寻找上删除的功能,正常删除功能的文件没有经过校验或者不严格,攻击者控制这个可操作的变量配合目录遍历进行删除其他文件
<?php header("Content-type:text/html;charset=utf-8"); $filename = $_GET['file']; if (file_exists($filename)) { unlink($filename); echo "<script>alert('删除成功')</script>"; } else{ echo "<script>alert('删除失败')</script>"; } ?>