1. 常见的网站漏洞 OWASP TOP 10:每年公布关于web安全的十大安全威胁报告,三年公开一次
SQL注入(key):渗透数据库,获取数据库数据或者控制权限
XSS
文件上传(key):上传木马病毒到网站中
反序列化
文件包含
CSRF
命令执行(key):获取命令执行的权限
信息泄露
XXE
SSRF
未授权访问
2. DVWA靶场 OWASP的官方网站
1. DVMA搭建
1. 六步快速搭建(使用phpstudy 2018)
下载安装PHPstudy
将解压后的DVWA源码放在phpstudy安装目录的PHPTutorial\WWW目录下
进入DVMA/config目录,将config.inc.php.dist最后的.dist后缀删除
打开刚刚修改的config.inc.php,修改db_user和db_password全为root
访问localhost/DVMA,点击setup,然后点击最下面的Create DataBase
访问localhost/DVMA,输入账号密码,admin 和 password,登录
2. 使用小皮面板
下载安装小皮面板
将下载解压后的DVWA源码放在www目录下
进入DVMA/config目录,将config.inc.php.dist最后的.dist后缀删除
打开刚刚修改的config.inc.php,修改db_user和db_password全为root(小皮面板使用的是内置的另一个MySql,如果之前电脑中已经安装MySql,记得改DVWA下config.inc.php中默认的MySql端口号,小皮面板中的配置也记得改)
访问localhost/DVMA,点击setup,然后点击最下面的Create DataBase
访问localhost/DVMA,输入账号密码,admin 和 password,登录
3. DVWA命令执行漏洞 攻击者在执行远程的控制命令时,由于系统设置的不完善,导致攻击者可以执行一些特殊的命令,从而取得权限
1. 常用连接符
cmd1|cmd2,无论是cmd1是否执行成功,均执行cmd2
cmd1;cmd2,无论是cmd1是否执行成功,均执行cmd2
cmd1&cmd2,无论是cmd1是否执行成功,均执行cmd2
cmd1||cmd2,只有cmd1失败时才执行cmd2
cmd1&&cmd2,只有cmd1成功时才执行cmd2
2. 常见cmd命令
whoami:当前用户名
shutdown -s -t 0:立即关机
net user [username] [password] /add 添加用户,用户名为username,密码为password
type [file_name] 查看file_name文件的内容
3. Command injection 攻击之前首先将防御级别改低
输入whoami类似的
4. 防御策略 过滤管道符:|,&,;,||,&&符号替换为空格或者检测到时便停止程序
5. 防御 low 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?php if ( isset ( $_POST [ 'Submit' ] ) ) { $target = $_REQUEST [ 'ip' ]; if ( stristr ( php_uname ( 's' ), 'Windows NT' ) ) { $cmd = shell_exec ( 'ping ' . $target ); } else { $cmd = shell_exec ( 'ping -c 4 ' . $target ); } echo "<pre>{$cmd} </pre>" ; } ?>
未做任何的过滤
6. 防御 medium 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <?php if ( isset ( $_POST [ 'Submit' ] ) ) { $target = $_REQUEST [ 'ip' ]; $substitutions = array ( '&&' => '' , ';' => '' , ); $target = str_replace ( array_keys ( $substitutions ), $substitutions , $target ); if ( stristr ( php_uname ( 's' ), 'Windows NT' ) ) { $cmd = shell_exec ( 'ping ' . $target ); } else { $cmd = shell_exec ( 'ping -c 4 ' . $target ); } echo "<pre>{$cmd} </pre>" ; } ?>
只对&&和;做了防御
7. 防御 high 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 <?php if ( isset ( $_POST [ 'Submit' ] ) ) { $target = trim ($_REQUEST [ 'ip' ]); $substitutions = array ( '&' => '' , ';' => '' , '| ' => '' , '-' => '' , '$' => '' , '(' => '' , ')' => '' , '`' => '' , '||' => '' , ); $target = str_replace ( array_keys ( $substitutions ), $substitutions , $target ); if ( stristr ( php_uname ( 's' ), 'Windows NT' ) ) { $cmd = shell_exec ( 'ping ' . $target ); } else { $cmd = shell_exec ( 'ping -c 4 ' . $target ); } echo "<pre>{$cmd} </pre>" ; } ?>
单纯进行了拓宽,效果不好,注意“| ”后是有一个空格的,“|”不带空格的拦截不了,开发时注意
8. 防御 impossible 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <?php if ( isset ( $_POST [ 'Submit' ] ) ) { checkToken ( $_REQUEST [ 'user_token' ], $_SESSION [ 'session_token' ], 'index.php' ); $target = $_REQUEST [ 'ip' ]; $target = stripslashes ( $target ); $octet = explode ( "." , $target ); if ( ( is_numeric ( $octet [0 ] ) ) && ( is_numeric ( $octet [1 ] ) ) && ( is_numeric ( $octet [2 ] ) ) && ( is_numeric ( $octet [3 ] ) ) && ( sizeof ( $octet ) == 4 ) ) { $target = $octet [0 ] . '.' . $octet [1 ] . '.' . $octet [2 ] . '.' . $octet [3 ]; if ( stristr ( php_uname ( 's' ), 'Windows NT' ) ) { $cmd = shell_exec ( 'ping ' . $target ); } else { $cmd = shell_exec ( 'ping -c 4 ' . $target ); } echo "<pre>{$cmd} </pre>" ; } else { echo '<pre>ERROR: You have entered an invalid IP.</pre>' ; } } generateSessionToken ();?>
重点是其中的
1 2 3 4 5 6 7 8 1 $target = stripslashes ( $target );2 $octet = explode ( "." , $target ); 3 if ( ( is_numeric ( $octet [0 ] ) ) && ( is_numeric ( $octet [1 ] ) ) && ( is_numeric ( $octet [2 ] ) ) && ( is_numeric ( $octet [3 ] ) ) && ( sizeof ( $octet ) == 4 ) ) { 4 $target = $octet [0 ] . '.' . $octet [1 ] . '.' . $octet [2 ] . '.' . $octet [3 ];
1.将用户输入中的反斜线去掉,防止转义字符
2.将输入的Ip按照”.”分开
3.判断分开的每个部分是不是都是数字并且总的数量为4
4.再将4个部分的数字用三个“.”给拼接起来