数据来源
本文仅用于信息安全学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。
为什么要攻击网站?常见的网站漏洞有哪些?
在互联网中,WEB(网站)服务数量庞大,且易存在安全漏洞,是渗透测试前期攻击的不二之选
OWASP TOP 10::这是每年的一份关于web应用的十大威胁安全报告,会在经过安全专家的测验之后确定十大类对当前web应用威胁最大和被应用最广的漏洞,同时也会对其进行详细的分析威胁所在。
漏洞靶场之DVWA
DVWA靶场搭建
DVWA是 OWASP 官方编写的PHP网站,包含了各种网站常见漏洞,可以学习攻击及修复方式
DVWA搭建步骤:
- PHP环境:Windows Apache Mysql Php
- DWWA源代码:https://github.com/digininja/dvwa/archive/master.zip
DVWA源码 - 按照下面的步骤修改过
六步快速搭建DVWA
1)下载并安装Phpstudy(安装过程可以一路下一步,也可以改安装路径) http://public.xp.cn/upgrades/PhpStudy2018.zip
2)将解压后的DVWA原代码放置 phpstudy 安装目录的WWW文件夹(这里建议将文件名:DVWA-master改成DVWA)
3)进入 DVWA/config 目录,将文件名为:config.inc.php.dist最后的dist删去
4)打开刚刚重命名的 config.inc.php文件,修改 db_user(数据库用户) 和 db_password(数据库密码)改为 :root root
5)启动Phpstudy,并在浏览器访问:http://127.0.0.1/DVWA/setup.php,点击最下方的 Create Database(创建数据库)
我这里因为我的桌面没有快捷方式,就直接来到安装目标启动软件了,之后可自行创建快捷方式
注意:这里的浏览器访问路径是根据,你刚才对DVWA-master文件重命名后的文件名决定的,如果刚才没有重命名默认的文件名是DVWA-master,那这里浏览器访问时就填:http://127.0.0.1/DVWA-master/setup.php
点击创建数据库
6)浏览器访问:http://127.0.0.1/DVWA/ ,输入用户名: admin 密码: password 登录dvwa
第5步做完之后就会自动跳转到数据库的登录页面,然后输入账号密码即可(如果没有自动跳转就手动输入,如果还是不行就检查第4步的账号密码有没有写错)
危害巨大的漏洞-命令执行
命令执行漏洞详解
一般岀现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上,一般会给用户提供一个ping操作的web界面,用户从web界面输入目标P,提交后后台会对该P地址进行一次png测试并返回测试结果。而如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交恶意命令,让后台进行执行,从而获得后台服务器权限。
常用的cmd命令:
whoami # 查看当前用户名
ipconfig # 查看网卡信息
shutdown -s -t 0 # 关机,-s 关机 -t 设置定时器 0表示0秒
shutdown -a # 取消一切定时
net user username password /add # 增加一个用户名为 username密码为 password的新用户
type 文件名.扩展名 # 查看 filename文件内容
Command Injection 防御详细
1)low (低级防御,几乎不设防)
实现步骤如下:
可以测试一下网站的漏洞:
127.0.0.1&whoami # 获取网站主机的名称 (可以自行换成其他连接符和windos命令,多尝试才能学到知识)
可以在cmd命令行验证
127.0.0.1&shutdown -s # 将网站主机关机
这个网站为啥会有这种漏洞?我们可以查看网站的源代码分析原因
代码漏洞解析:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// 确定操作系统并执行ping命令
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
echo "<pre>{$cmd}</pre>";
}
?>
如何防御这种命令执行的漏洞?防御命令执行的最高效的方法,就是过滤命令连接符
2)medium(中级防御)
渗透测试解决方法:
- 白盒测试 可以看到源代码,查看源代码过滤机制
- 黑盒测试 看不到源代码,依次尝试常见命令连接符
DVWA mediun防御中过滤了&&和;但并不会影响其他符号正常使用
实现步骤如下:
回到网站把安全等级调到中级
其他步骤和前面的一样就不写了
代码解读:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Set blacklist
$substitutions = array(
'&&' => '',
';' => '',
);
// 删除阵列中($substitutions)匹配的任何字符(黑名单)
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// 确定操作系统并执行ping命令
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
echo "<pre>{$cmd}</pre>";
}
?>
把代码改成上面这样最终的命令执行效果是这样 ,比如黑客输入:
127.0.0.1&&shutdown -s 经过上面代码处理后就变成:127.0.0.1shutdown -s
最后网站执行:ping 127.0.0.1shutdown -s 肯定是执行不了的没有这样的命令,这样就能防御命令执行攻击,不过这里的防御等级是中级那肯定是不完善还是有漏洞的。
可以自行测试一下如:
127.0.0.1&&ipconfig # 这样执行不成功,但是我改成一个&或其他没有被过滤的连接符就不影响
127.0.0.1&ipconfig # 可以执行成功,查看网卡信息
3)High (高级防御)
实现步骤如下:
回到网站把安全等级调到高级
其他步骤和前面的一样就不写了
代码解析:
这里需要注意的是现在的等级还是高级,说明还是有漏洞的,比如下面的'| ' 这里|后面有个空格,很多开发者都有个问题,不小心或个人的代码编写习惯会在代码后面多敲一个空格,这里只能匹配:| 空格 如果没有空格是过滤不掉的,可以自行测试。
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = trim($_REQUEST[ 'ip' ]);
// Set blacklist
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
// Remove any of the characters in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// 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
echo "<pre>{$cmd}</pre>";
}
?>
可以自行测试一下如:
127.0.0.1| ipconfig # 有空格的情况
127.0.0.1|ipconfig # 没有空格的情况
4)impossible(不可能的,最高级防御)
实现步骤如下:
回到网站把安全等级调到最高级
其他步骤和前面的一样就不写了
代码解析:
有些用户为了转义特殊字符可能会加上反斜杠“\”
impossible 的防御正如其名,不可能被攻击,是安全开发人员的典范,其他后端语言也可实现相应算法
<?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
echo "<pre>{$cmd}</pre>";
}
else {
// Ops. Let the user name theres a mistake
echo '<pre>ERROR: You have entered an invalid IP.</pre>';
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>