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 注入代码审计:

 


 

前端代码:

 

SQL注入与XSS跨站脚本的基本原理


 

 

1) 注入过程:

 



 

打开评论区

 

SQL注入与XSS跨站脚本的基本原理



评论:哇,文章好精彩啊,提交表单之后,数据插入数据库,然后前端展示评论

 

SQL注入与XSS跨站脚本的基本原理


 

 

 

 

接下来我们尝试在评论区提交以下html标签试试?

 

尝试提交一个 <input type="submit" value="Test XSS"/>

 

SQL注入与XSS跨站脚本的基本原理


 

 结果发现,插入了一个按钮,察看下源代码试试?

 

SQL注入与XSS跨站脚本的基本原理


 

 

发现我们提交的评论被原样展示了出来



因此判定此处存在XSS漏洞;


插入数据库的数据会持久化保存,因此,此类型的XSS漏洞为存储性XSS漏洞。

 

那么什么又是反射型XSS?

 

代码我就懒得再写了,我是这样理解的(经过数据持久化的就叫存储型,反之则反射型

 

还有一种说法,反射性是需要某个条件触发才会执行你注入的代码,比如鼠标的哦javascript 中的 onclick 事件等等。

 

 

(三)SQL注入原理解析

 

DAO 层代码审计:

SQL注入与XSS跨站脚本的基本原理


 

发现是代码拼接字符串拼成一个完整的sql语句;


控制层源码: 

SQL注入与XSS跨站脚本的基本原理


登录页面源码:

 

SQL注入与XSS跨站脚本的基本原理


顺便给大家看看我的user表里的数据,为了方便演示我就不用md5加密的方式登录了。

 

SQL注入与XSS跨站脚本的基本原理


 

接下来尝试从前端登录(瞎Jb输入的,数据库中正确的用户名和密码是 testSQL: testSQL

 

SQL注入与XSS跨站脚本的基本原理


 

 

结果显示

 

SQL注入与XSS跨站脚本的基本原理


 

 

如果检测出了sql注入漏洞,那么我们该如何使用错误的用户名和密码登录成功呢?

请看下面分析:

 

前面说了,后台程序是用的拼接字符串的方式来完成一条sql语句,那么构思。

 

查询语句一般都是 select username,password from user where username=’username’ and password = ‘password’

 

 

 

SQL注入与XSS跨站脚本的基本原理

后台的sql语句,由此可得,增加一个判断。

 

select username,password from user where username=’username’ and password = ‘password’ or ‘1’ = ‘1’

 

接下来我在前端演示一遍。

 

SQL注入与XSS跨站脚本的基本原理登录成功了!

 


 

 

我们看下传到后台之后的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跨站脚本的基本原理的主要内容,如果未能解决你的问题,请参考以下文章

xss攻击(跨站脚本)

XSS跨站脚本攻击

目前日向博客对xss跨站脚本注入和sql注入的防范

php防止sql注入以及xss跨站脚本攻击

XSS 跨站脚本攻击(Cross Site Scripting)

XSS原理及代码分析