安全問題工作中

水平越權漏洞介紹越權

漏洞主要分爲水平越權和垂直越權。

水平越權主要是指用戶操作服務端數據時,服務端未驗證數據是否歸屬於請求用戶。使得攻擊者可操作其他用戶數據,導致水平越權漏洞。

垂直越權又稱權限提升。其主要原因是由於應用程序沒有做權限控制,或僅通過JavaScript在前端進行權限控制,導致攻擊者猜測到管理頁面或繞過前端驗證,達到權限提升的目的。

水平越權漏洞危害攻擊者可越權操作

(增加、刪除、修改和查詢)其他用戶的數據。

Gson

1\

初步可以定位爲Gson在對Date類型進行序列化和反序列化的處理不一致造成,查看Gson的源碼(1.7.1),問題得到確認:

Gson默認的Date類型處理類,有三種格式:enUs、local、iso8601

                      序列化時使用enUsFormat

                      反序列化時首先嚐試localFormat

2\

gson常見問題
1、序列化時int類型默認會轉換成double類型,帶小數位 .0 ,  com.md.jr.eco.common.utils.GsonUtils 默認 已修復此轉換問題

2、對象中如有定義  boolean 類型字段 ,如  private boolean isSuccess;   

      fastjson  序列化結果爲 {"code":"0000","info":"成功","success":true}

          gson   序列化結果爲 {"isSuccess":true,"code":"0000","info":"成功"}

      {"code":"0000","info":"成功","success":true}   此json串 反序列化時 fastjson 結果爲true ,gson 結果會是 false   ,gson反序列化結果明顯不符合預期  

     鑑於以上結果  在定義boolean類型字段時  不要帶 is 

3、gson中JsonObject操作時,使用不存在的key操作時 會報空指針,fastjson反而不會報錯

4、   與系統Locale 相關。【通過localFormat、enUsFormat、iso8601Format三種format來解析日期】
        .查看環境LANG 配置:
        調整系統配置:zh_CH.UTF-8 並Source

5、 日期

gson默認日期格式,與地區有關,new SimpleDateFormat()生成的

這是一個很暴力的適配器模式, localFormat, enUsFormat, ISO8601Utils挨個嘗試轉換,那麼這三個值具體是什麼呢, 打個斷點來看看:
ISO8601:
首先是ISO8601,Google的大佬直接hard code 成Locale.US.
ISO8601

這是個UTC時間, T標識是UTC時間,Z標識時區, 北京時間比UTC快的8個小時, 會被記作UTC+8, 這就是東八區的由來, 如下:

enUsFormat
美國的時間會標記出上午和下午, 時間格式是MMM dd, yyyy hh:mm:ss a, 例如Sep 16, 2015 10:34:23 AM.

LocalFormat:
最後是localFormat,

cn-localFormat

注意到這個java.text.DateFormat#getDateTimeInstance(int, int)這個方法,
不同地區規定的常用日期格式是不一樣的, 查詢WIKI百科各地日期和時間表示法,得知這個日期格式是臺灣的常用日期格式,
問題它怎麼知道我是在美國還是在中國臺灣, 看getDateTimeInstance方法的源碼
getDateTimeInstance()

發現這個方法在Java7之後, 根據操作系統的語言, 判斷用戶所在的時區,
那現在將WIN10控制面板=>時鐘、語言和區域=>添加語言=>更改windows顯示語言爲英語-美國, 再來看localFormat變成了什麼:

us-localFormat

坑爹啊Gson, 使用locale命令查一查線上CentOS7的語言環境

[root@VM_0_9_centos ~]# locale
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

果然是英文環境, 這樣的話yyyy-MM-dd HH:mm:ss,
既無法被UTC時間yyyy-MM-dd’T’HH:mm:ss’Z’適配,
無法被美國默認時間MMM dd, yyyy hh:mm:ss a適配, 最後拋出了JsonSyntaxException.

根治:
改成中文, 並重啓系統
// 查看系統擁有語言包
locale -a
zh_CN.UTF-8是簡體中文,如果沒有zh_CN.UTF-8,就安裝語言包,如果存在可以直接設置
// 安裝簡中語言包
yum install kde-l10n-Chinese
永久修改系統語言
localectl set-locale LANG=zh_CN.UTF8

Exception in thread "main" com.google.gson.JsonSyntaxException: 2018-03-26 22:22:35
    at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:74)
	at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:59)
	at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:41)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
	at com.google.gson.Gson.fromJson(Gson.java:888)
	at com.google.gson.Gson.fromJson(Gson.java:853)
	at com.google.gson.Gson.fromJson(Gson.java:802)
	at com.google.gson.Gson.fromJson(Gson.java:774)
	at web.service.JsonTest.main(JsonTest.java:25)
Caused by: java.text.ParseException: Failed to parse date ["2018-03-26 22:22:35']: Invalid time zone indicator ' '
	at com.google.gson.internal.bind.util.ISO8601Utils.parse(ISO8601Utils.java:274)
	at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:72)
	... 9 more
Caused by: java.lang.IndexOutOfBoundsException: Invalid time zone indicator ' '
	at com.google.gson.internal.bind.util.ISO8601Utils.parse(ISO8601Utils.java:245)
	... 10 more

private synchronized Date deserializeToDate(String json) {
    try {
      return localFormat.parse(json);
    } catch (ParseException ignored) {
    }
    try {
      return enUsFormat.parse(json);
    } catch (ParseException ignored) {
    }
    try {
    	return ISO8601Utils.parse(json, new ParsePosition(0));
    } catch (ParseException e) {
      throw new JsonSyntaxException(json, e);
    }
  }```

### 

➜  gson git:(master) find ./ -type f -name "*.java" | xargs grep "datePattern"
.//gson/src/main/java/com/google/gson/DefaultDateTypeAdapter.java:  DefaultDateTypeAdapter(Class<? extends Date> dateType, String datePattern) {
.//gson/src/main/java/com/google/gson/DefaultDateTypeAdapter.java:    dateFormats.add(new SimpleDateFormat(datePattern, Locale.US));
.//gson/src/main/java/com/google/gson/DefaultDateTypeAdapter.java:      dateFormats.add(new SimpleDateFormat(datePattern));
.//gson/src/main/java/com/google/gson/GsonBuilder.java:  private String datePattern;
.//gson/src/main/java/com/google/gson/GsonBuilder.java:    this.datePattern = gson.datePattern;
.//gson/src/main/java/com/google/gson/GsonBuilder.java:    this.datePattern = pattern;
.//gson/src/main/java/com/google/gson/GsonBuilder.java:    this.datePattern = null;
.//gson/src/main/java/com/google/gson/GsonBuilder.java:    this.datePattern = null;
.//gson/src/main/java/com/google/gson/GsonBuilder.java:    addTypeAdaptersForDate(datePattern, dateStyle, timeStyle, factories);
.//gson/src/main/java/com/google/gson/GsonBuilder.java:        datePattern, dateStyle, timeStyle,
.//gson/src/main/java/com/google/gson/GsonBuilder.java:  private void addTypeAdaptersForDate(String datePattern, int dateStyle, int timeStyle,
.//gson/src/main/java/com/google/gson/GsonBuilder.java:    if (datePattern != null && !"".equals(datePattern.trim())) {
.//gson/src/main/java/com/google/gson/GsonBuilder.java:      dateTypeAdapter = new DefaultDateTypeAdapter(Date.class, datePattern);
.//gson/src/main/java/com/google/gson/GsonBuilder.java:      timestampTypeAdapter = (TypeAdapter) new DefaultDateTypeAdapter(Timestamp.class, datePattern);
.//gson/src/main/java/com/google/gson/GsonBuilder.java:      javaSqlDateTypeAdapter = (TypeAdapter) new DefaultDateTypeAdapter(java.sql.Date.class, datePattern);
.//gson/src/main/java/com/google/gson/Gson.java:  final String datePattern;
.//gson/src/main/java/com/google/gson/Gson.java:      LongSerializationPolicy longSerializationPolicy, String datePattern, int dateStyle,
.//gson/src/main/java/com/google/gson/Gson.java:    this.datePattern = datePattern;






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章