本文记录 Kali Linux 2018.1 学习使用和渗透测试的详细过程,教程为安全牛课堂里的《Kali Linux 渗透测试》课程
1. 简介
2. 判断漏洞
3. 服务器源码
3-1. dvwa Low 安全级别
3-2. dvwa Medium 安全级别
3-3. dvwa High 安全级别
1. 简介
从信任角度
- XSS:利用用户对站点的信任,攻击者通过注入程序来修改网站来使用户浏览器被重定向等
- CSRF:利用站带你对已经身份认证的用户的信任,攻击者伪造一个链接误导用户点击链接来使用用户的身份认证来访问服务器
结合社工在身份认证会话过程中实现供给
- 修改账号密码、个人信息(email、收货地址)
- 发送伪造的业务请求(网银、购物、投票)
- 关注他人社交账号、推送博文
- 在用户非自愿、不知情的情况下提交请求
业务逻辑漏洞
- 服务器对关键操作缺少确认机制
- 自动扫描程序无法发现此漏洞
漏洞利用条件
- 被害用户已经完成身份认证
- 新请求的提交不需要重新身份认证或确认机制
- 攻击者必须了解 Web APP 请求的参数构造
- 诱使用户触发攻击的指令(社工)
BurpSuite CSRF PoC gennretor
- POST / GET 方法
自动扫描程序的检测方法
- 在请求和响应过程中检查是否存在 anti-CSRF tokec 名
- 见擦汗服务器是否严恒 anti-CSRF token 的名值
- 检查 tiken 中可编辑的字符串
- 检查 referer 头是否可以伪造
对策
- captcha
- anti-CSRF token
- referer 头
- 降低会话超时时间
2. 判断漏洞
新的修改密码请求不需要输入原密码、
攻击者修改服务器 URL 地址,诱导用户点击修改密码
http://10.10.10.132/dvwa/vulnerabilities/csrf/?password_new=aaaaaaaa&password_conf=aaaaaaaa&Change=Change # 放在 kali 本机,kali 模拟访问
普通用户在正常登陆 dvwa 的时候,点击此链接
# 被攻击者的密码被修改
# 攻击者可以使用新的密码进行登录
生成 PoC 文件,证明漏洞存在
# 将 URL 保存至文件诱导用户访问(同上)
2. 服务器源码
1. dvwa Low 安全级别
<?php
if (isset($_GET['Change'])) {
// Turn requests into variables
$pass_new = $_GET['password_new'];
$pass_conf = $_GET['password_conf'];
if (($pass_new == $pass_conf)){
$pass_new = mysql_real_escape_string($pass_new);
$pass_new = md5($pass_new);
$insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";
$result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' );
echo "<pre> Password Changed </pre>";
mysql_close();
}
else{
echo "<pre> Passwords did not match. </pre>";
}
}
?>
2. dvwa Medium 安全级别
<?php
if (isset($_GET['Change'])) {
// Checks the http referer header
//只支持上一级的页面是来自本机的(由本机的页面跳转的此页面)
if ( eregi ( "127.0.0.1", $_SERVER['HTTP_REFERER'] ) ){
// Turn requests into variables
$pass_new = $_GET['password_new'];
$pass_conf = $_GET['password_conf'];
if ($pass_new == $pass_conf){
$pass_new = mysql_real_escape_string($pass_new);
$pass_new = md5($pass_new);
$insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";
$result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' );
echo "<pre> Password Changed </pre>";
mysql_close();
}
else{
echo "<pre> Passwords did not match. </pre>";
}
}
}
?>
# 只需要使用 burpsuite 修改 referer 值为本机
3. dvwa High 安全级别
<?php
if (isset($_GET['Change'])) {
// Turn requests into variables
$pass_curr = $_GET['password_current'];
$pass_new = $_GET['password_new'];
$pass_conf = $_GET['password_conf'];
// Sanitise current password input
$pass_curr = stripslashes( $pass_curr );
$pass_curr = mysql_real_escape_string( $pass_curr );
$pass_curr = md5( $pass_curr );
// Check that the current password is correct
$qry = "SELECT password FROM `users` WHERE user='admin' AND password='$pass_curr';";
$result = mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>' );
if (($pass_new == $pass_conf) && ( $result && mysql_num_rows( $result ) == 1 )){
$pass_new = mysql_real_escape_string($pass_new);
$pass_new = md5($pass_new);
$insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";
$result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' );
echo "<pre> Password Changed </pre>";
mysql_close();
}
else{
echo "<pre> Passwords did not match or current password incorrect. </pre>";
}
}
?>