SQL注入与XSS跨站脚本的基本原理
Posted 锋刃科技
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入与XSS跨站脚本的基本原理相关的知识,希望对你有一定的参考价值。
前言:
各位大牛好,我是Alone,这篇文章主要讲XSS/SQL注入的一个基本原理,适合新手入门学习,大佬勿喷,小弟不才,这些原理都是通过自己的实战和摸索得来的经验,可能有认识错误的地方,还望大佬指点一二,小弟感激不尽~
一、XSS注入
0)什么是 XSS?
答:XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。 (引用百度百科)
1)什么是XSS攻击?
答:XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括html代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而javascript是新型的“ShellCode”。 (引用百度百科)
2)XSS分类?
答:存储型、反射型。
3)传统防御
答:过滤敏感标签
4)XSS注入原理
答:(个人总结)通过前端表单数据传递到后台,后台没有经过任何的防御或过滤措施,后台再将数据返回给前端导致出现XSS漏洞,具体看实战操作!
二、SQL注入
0)什么是SQL注入?
答:所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1] 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。 (引用百度百科)
1)SQL注入原理?
答:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
(引用百度百科)
2)防护
归纳一下,主要有以下几点:
0)永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和
双"-"进行转换等。
1)永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
2)永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
3)不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
4)应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。
5)sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
实验如下:
(一)
0)测试环境:Tomcat 8.5
1)代码审计:Java
2)具有 XSS 注入漏洞的代码;
3)具有 SQL 注入漏洞的代码;
(二)XSS 原理解析
0)XSS 注入代码审计:
前端代码:
1) 注入过程:
打开评论区
评论:哇,文章好精彩啊,提交表单之后,数据插入数据库,然后前端展示评论
接下来我们尝试在评论区提交以下html标签试试?
尝试提交一个 <input type="submit" value="Test XSS"/>
结果发现,插入了一个按钮,察看下源代码试试?
发现我们提交的评论被原样展示了出来
因此判定此处存在XSS漏洞;
插入数据库的数据会持久化保存,因此,此类型的XSS漏洞为存储性XSS漏洞。
那么什么又是反射型XSS?
代码我就懒得再写了,我是这样理解的(经过数据持久化的就叫存储型,反之则反射型)
还有一种说法,反射性是需要某个条件触发才会执行你注入的代码,比如鼠标的哦javascript 中的 onclick 事件等等。
(三)SQL注入原理解析
DAO 层代码审计:
发现是代码拼接字符串拼成一个完整的sql语句;
控制层源码:
登录页面源码:
顺便给大家看看我的user表里的数据,为了方便演示我就不用md5加密的方式登录了。
接下来尝试从前端登录(瞎Jb输入的,数据库中正确的用户名和密码是 testSQL: testSQL)
结果显示
如果检测出了sql注入漏洞,那么我们该如何使用错误的用户名和密码登录成功呢?
请看下面分析:
前面说了,后台程序是用的拼接字符串的方式来完成一条sql语句,那么构思。
查询语句一般都是 select username,password from user where username=’username’ and password = ‘password’
后台的sql语句,由此可得,增加一个判断。
select username,password from user where username=’username’ and password = ‘password’ or ‘1’ = ‘1’
接下来我在前端演示一遍。
登录成功了!
我们看下传到后台之后的sql语句是怎么样的:
这是后台打印的log
原理很简单,他拼装sql字符串的时候,我们可以通过条件语句来控制这个sql。
比如刚刚
select name,password from book_user where name='username' and password='username' or '1' = '1'
username' or '1' = ' 这个是我们传进去的参数
正常情况下是这样:
select name,password from book_user where name='username' and password='username'
这时候我们在脑海里想象一下,一个变量被赋值然后拼接字符串,如何让它执行我的条件语句。
红色部分就是我们提交的参数如:
0)密码参数 Alone
Sql: select name,password from book_user where name='username' and password='Alone'
1)密码参数 Alone’
Sql: select name,password from book_user where name='username' and password='Alone''
当然这样后台会直接报错,通常会使用这种方式检测是否存在sql注入漏洞。
2)密码参数 Alone or '1'='1
Sql: select name,password from book_user where name='username' and password='Alone' or '1'='1'
这样是不是刚好拼接成一个完整的sql语句?
Ok,今天你收获了吗?
本文仅用于技术研究与探讨,任何个人,团体,组织不得将其用于非法目的,违法犯罪必将受到法律制裁。
本文已获作者授权,转载务必注明作者及出处。
以上是关于SQL注入与XSS跨站脚本的基本原理的主要内容,如果未能解决你的问题,请参考以下文章