精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入Fastjson源碼命令執(zhí)行調(diào)試

開發(fā) 前端
調(diào)試的過程,底層其實就是先對Object進行反序列化,再對具體的Person類進行反序列化,中間有一些重復(fù)的過程,當(dāng)然底層有很多過程其實很難一個個去分析出來,重點一定要先自己先調(diào)試完,自己多走幾遍可能就知道它流程了。

寫作背景

之前寫過一篇fastjson漏洞文章,但是當(dāng)時在復(fù)現(xiàn)利用鏈的過程中一直沒有彈出計算器,而且利用鏈的代碼單步調(diào)試也沒有給出來,這次我要通過底層代碼把漏洞實現(xiàn)過程展現(xiàn)出來。

fastjson漏洞demo

上次不是沒有彈出計算器嗎,這次我先把可以彈出計算器的漏洞demo先講解一下。

  • 創(chuàng)建一個普通類Person
import java.util.Properties;

//創(chuàng)建一個普通類
public class Person {
    private String name;
    private int age;
    private String sex;
    private Properties properties;

    public Person() {
        System.out.println("構(gòu)造方法");
    }

    //Setter Getter方法
    public String getName() {
        System.out.println("getName");
        return name;
    }

    public void setName(String name) {
        System.out.println("setName");
        this.name = name;
    }

    public int getAge() {
        System.out.println("getAge");
        return age;
    }

    public String getSex(){
        System.out.println("getAddress");
        return sex;
    }

    public Properties getProperties() throws Exception {
        System.out.println("getProperties");
        Runtime.getRuntime().exec("open -a /System/Applications/Calculator.app");
        return properties;
    }
}
  • 反序列化測試
import com.alibaba.fastjson.JSON;

public class Demo {
    public static void main(String[] args){
        String jsonstring ="{\"@type\":\"com.FastjsonDemo.Person\",\"age\":18,\"name\":\"lili\",\"address\":\"china\",\"properties\":{}}";
        //JSON.parseObject() 方法將 jsonstring 字符串解析并轉(zhuǎn)換為一個通用的 Object 對象
        Object obj = JSON.parseObject(jsonstring, Object.class);
        System.out.println(obj);
    }
}

  • 測試結(jié)果

1687937316_649be124cc1a2eef0df3e.png!small1687937316_649be124cc1a2eef0df3e.png!small

代碼調(diào)試講解

  1. 我們在JSON.parseObject位置處打上斷點

1687937342_649be13ef0c5cd18a34cb.png!small1687937342_649be13ef0c5cd18a34cb.png!small

  1. f7步入,進入到parseObject(String text, Class<T> clazz)方法中,text為要解析的JSON字符串;clazz為要轉(zhuǎn)換的目標(biāo)類型,Class<T>中的T為范型參數(shù),表示要轉(zhuǎn)換成的具體類型。在這個方法的實現(xiàn)中,它再次調(diào)用自己,通過遞歸無限循環(huán)調(diào)用自身。
public static <T> T parseObject(String text, Class<T> clazz) {
    return parseObject(text, clazz);
}

1687937363_649be1531fc289d742fdc.png!small1687937363_649be1531fc289d742fdc.png!small

  1. f7繼續(xù)步入,進入parseObject(String json, Class<T> clazz, Feature... features)方法,這里又是一個重載方法,接受了三個參數(shù):一個JSON字符串json、目標(biāo)類型的Class<T>對象clazz和可選的特性(features)數(shù)組。在方法的實現(xiàn)中,它掉用了另一個重載的'parseObject'方法,將解析過程委托給它。這個新的重載方法接受了更多的參數(shù),包括:ParserConfig對象、ParseProcess對象以及默認(rèn)的解析特性(DEFAULT_PARSER_FEATURE)。
public static <T> T parseObject(String json, Class<T> clazz, Feature... features) {
    return parseObject(json, clazz, ParserConfig.global, (ParseProcess)null, DEFAULT_PARSER_FEATURE, features);
}

1687937388_649be16c9b766b3612ff6.png!small1687937388_649be16c9b766b3612ff6.png!small

  1. f7步入到 public static <T> T parseObject(String input, Type clazz, ParserConfig config, ParseProcess processor, int featureValues, Feature... features) {...}方法中

1687937405_649be17d73e3f75a24438.png!small1687937405_649be17d73e3f75a24438.png!small

  1. 我們詳細(xì)看一下這段代碼,目的是將輸入的input字符串解析為指定類型 'clazz' 的java對象。
public static <T> T parseObject(String input, Type clazz, ParserConfig config, ParseProcess processor, int featureValues, Feature... features) {
  	//input為{"@type":"com.FastjsonDemo.Person","age":18,"name":"lili","address":"china","properties":{}}
    if (input == null) {
        return null;
    } else {
      	//features為Feature[0]@497
        if (features != null) {
            Feature[] var6 = features;
          	//定義特性數(shù)組長度var7
            int var7 = features.length;

            for(int var8 = 0; var8 < var7; ++var8) {
              	//獲取當(dāng)前索引var8位置的特性對象,并將其復(fù)制給變量feature
                Feature feature = var6[var8];
              	//使用按位或操作符(|=)將當(dāng)前特性的掩碼(feature.mask)與featureValues進行按位或運算,并將結(jié)果重新賦值給featureValues
                featureValues |= feature.mask;
            }
        }
      	//創(chuàng)建一個DefaultJSONParser對象parser,用于解析JSON字符串。這個對象使用傳入的輸入字符串、配置對象config和特性值featureValues進行初始化。
        DefaultJSONParser parser = new DefaultJSONParser(input, config, featureValues);
      	//處理解析過程中的處理器processor,此時processor為null
        if (processor != null) {
            if (processor instanceof ExtraTypeProvider) {
                parser.getExtraTypeProviders().add((ExtraTypeProvider)processor);
            }

            if (processor instanceof ExtraProcessor) {
                parser.getExtraProcessors().add((ExtraProcessor)processor);
            }

            if (processor instanceof FieldTypeResolver) {
                parser.setFieldTypeResolver((FieldTypeResolver)processor);
            }
        }
      	//解析JSON字符串并得到解析結(jié)果對象
        T value = parser.parseObject(clazz, (Object)null);
      	//處理解析結(jié)果中的后續(xù)任務(wù)
        parser.handleResovleTask(value);
      	//關(guān)閉解析器
        parser.close();
      	//返回解析結(jié)果對象
        return value;
    }
}
  1. 跟著f8步過代碼
  • 首先執(zhí)行循環(huán)
for(int var8 = 0; var8 < var7; ++var8) {
    Feature feature = var6[var8];
    featureValues |= feature.mask;
}
  • 隨后跳轉(zhuǎn)創(chuàng)建DefaultJSONParser對象
DefaultJSONParser parser = new DefaultJSONParser(input, config, featureValues);

1687937426_649be192bdf7d20aea2f2.png!small1687937426_649be192bdf7d20aea2f2.png!small

  • 繼續(xù)執(zhí)行processor的判斷,因為processor為空,跳過判斷
if (processor != null) {...}
  • 隨后進行解析JSON字符串并得到解析結(jié)果對象

這里是使用解析器parser對JSON字符串進行解析,并將解析結(jié)果賦值給變量value。解析的目標(biāo)類型由參數(shù)clazz指定,該方法返回了一個泛型類型T的對象。

T value = parser.parseObject(clazz, (Object)null);
  • 直接f8跳轉(zhuǎn)下一步,可以發(fā)現(xiàn)計算器被彈出來,造成命令執(zhí)行

1687937451_649be1ab335e64a288968.png!small1687937451_649be1ab335e64a288968.png!small

  1. 重點調(diào)試parser.parseObject(clazz, (Object)null)代碼
T value = parser.parseObject(clazz, (Object)null);
  • f7步入代碼

1687937468_649be1bcbd81d8fb44dfd.png!small1687937468_649be1bcbd81d8fb44dfd.png!small

public <T> T parseObject(Type type, Object fieldName) {
  	//獲取當(dāng)前JSON的token類型
    int token = this.lexer.token();
    if (token == 8) {//如果當(dāng)前token是JSON的null值(8代表null)
        this.lexer.nextToken();//跳過null值解析
        return null;
    } else {
        if (token == 4) {//如果當(dāng)前token是JSON的字符串值(4代表字符串)
            if (type == byte[].class) {//判斷期望類型是否為 'byte[]'
                byte[] bytes = this.lexer.bytesValue();//如果是,獲取字節(jié)數(shù)組值
                this.lexer.nextToken();//跳過字符串值的解析
                return bytes;//返回字節(jié)數(shù)組值
            }

            if (type == char[].class) {//判斷其我想是否為 'char[]'
                String strVal = this.lexer.stringVal();
                this.lexer.nextToken();
                return strVal.toCharArray();//將字符串轉(zhuǎn)換為字符數(shù)組并返回
            }
        }
      	//以上都不滿足,根據(jù)期望類型獲取相應(yīng)的'ObjectDeserializer',并使用它來解析
        ObjectDeserializer derializer = this.config.getDeserializer(type);

        try {
            return derializer.deserialze(this, type, fieldName);//通過config(ParserConfig對象)獲取相應(yīng)類型的反序列化器,并調(diào)用deserialze方法進行解析。該方法會根據(jù)給定的JSON類型和字段名,將當(dāng)前解析器作為參數(shù),返回解析后的Java對象。
        } catch (JSONException var6) {
            throw var6;
        } catch (Throwable var7) {
            throw new JSONException(var7.getMessage(), var7);
        }
    }
}
  • 初始化token值為12

1687937487_649be1cfdddaa35c28dae.png!small1687937487_649be1cfdddaa35c28dae.png!small

  • 不滿足if循環(huán)。會步入ObjectDeserializer derializer = this.config.getDeserializer(type);

1687937506_649be1e228bb9e77e936c.png!small1687937506_649be1e228bb9e77e936c.png!small

  1. 分析這段代碼實現(xiàn)細(xì)節(jié)
ObjectDeserializer derializer = this.config.getDeserializer(type);
  • f7步入,這段代碼是 'ParseConfig' 類中的 'getDeserializer(Type type)'方法,目的是根據(jù)給定的類型(Type)獲取相應(yīng)的反序列化器(ObjectDeserializer)。初始 derializers 為默認(rèn)值IdentityHashMap@659,derializer的值為null。隨后進行一個緩存類型的判斷:(1)如果類型type屬于 'Class' 類型,調(diào)用 getDeserializer(Class, Type)方法,傳入類型(Class)和類型(Type)進行處理;(2)如果類型(Type)是ParameterizedType類型,獲取原始類型(RawType)。隨后做了一個三元運算符判斷:如果原始類型是Class類型就調(diào)用getDeserializer(Class, Type)方法,對傳入原始類型(Class)和類型(Type)進行處理;否則就遞歸調(diào)用getDeserializer(Type)方法,對傳入原始類型(RawType)進行處理。(3)其他情況就返回默認(rèn)的反序列化器 'JavaObjectDeserializer.instance'。

1687937526_649be1f63d5dfc461fc30.png!small1687937526_649be1f63d5dfc461fc30.png!small

  • f7繼續(xù)步入后是一段基于身份比較hash映射的 'get' 方法

1687937545_649be2098a637e5a484fe.png!small1687937545_649be2098a637e5a484fe.png!small

  • 最終獲取的derializer值為JavaObjectDeserializer@660

1687937561_649be21924eec7e17bac3.png!small1687937561_649be21924eec7e17bac3.png!small

  • 返回反序列化器具體值:當(dāng)前對象DefaultJSONParser@542、類型type為Object對象、fieldName字段名為null、config屬性值為ParseConfig@540

1687937578_649be22a3181634b60767.png!small1687937578_649be22a3181634b60767.png!small

  • 返回值的具體實現(xiàn)可以f7繼續(xù)步入查看

1687937595_649be23befa5d3db58b9d.png!small1687937595_649be23befa5d3db58b9d.png!small

  • 底層是一個JSON解析器的 'parse' 方法,lexer的初始化默認(rèn)值為JSONScanner@655
public Object parse(Object fieldName) {
    JSONLexer lexer = this.lexer;
    switch(lexer.token()) {
    case 1:
    case 5:
    case 10:
    case 11:
    case 13:
    case 15:
    case 16:
    case 17:
    case 18:
    case 19:
    default:
        throw new JSONException("syntax error, " + lexer.info());
    case 2:
        Number intValue = lexer.integerValue();
        lexer.nextToken();
        return intValue;
    case 3:
        Object value = lexer.decimalValue(lexer.isEnabled(Feature.UseBigDecimal));
        lexer.nextToken();
        return value;
    case 4:
        String stringLiteral = lexer.stringVal();
        lexer.nextToken(16);
        if (lexer.isEnabled(Feature.AllowISO8601DateFormat)) {
            JSONScanner iso8601Lexer = new JSONScanner(stringLiteral);

            try {
                if (iso8601Lexer.scanISO8601DateIfMatch()) {
                    Date var11 = iso8601Lexer.getCalendar().getTime();
                    return var11;
                }
            } finally {
                iso8601Lexer.close();
            }
        }

        return stringLiteral;
    case 6:
        lexer.nextToken();
        return Boolean.TRUE;
    case 7:
        lexer.nextToken();
        return Boolean.FALSE;
    case 8:
        lexer.nextToken();
        return null;
    case 9:
        lexer.nextToken(18);
        if (lexer.token() != 18) {
            throw new JSONException("syntax error");
        }

        lexer.nextToken(10);
        this.accept(10);
        long time = lexer.integerValue().longValue();
        this.accept(2);
        this.accept(11);
        return new Date(time);
    case 12:
        JSONObject object = new JSONObject(lexer.isEnabled(Feature.OrderedField));
        return this.parseObject((Map)object, fieldName);
    case 14:
        JSONArray array = new JSONArray();
        this.parseArray((Collection)array, (Object)fieldName);
        if (lexer.isEnabled(Feature.UseObjectArray)) {
            return array.toArray();
        }

        return array;
    case 20:
        if (lexer.isBlankInput()) {
            return null;
        }

        throw new JSONException("unterminated json string, " + lexer.info());
    case 21:
        lexer.nextToken();
        HashSet<Object> set = new HashSet();
        this.parseArray((Collection)set, (Object)fieldName);
        return set;
    case 22:
        lexer.nextToken();
        TreeSet<Object> treeSet = new TreeSet();
        this.parseArray((Collection)treeSet, (Object)fieldName);
        return treeSet;
    case 23:
        lexer.nextToken();
        return null;
    }
}
  • f8步過,進入到case12。這里首先創(chuàng)建了一個新的JSONObject對象,并啟用了Feature.OrderedField特性(這個特性是用于指示是否保留JSON對象中字段的順序);隨后調(diào)用了當(dāng)前對象的parseObject方法,將剛剛創(chuàng)建的object對象作為參數(shù)傳遞進去,并傳遞fileName作為另一個參數(shù)。
case 12:
    JSONObject object = new JSONObject(lexer.isEnabled(Feature.OrderedField));
    return this.parseObject((Map)object, fieldName);

1687937621_649be2557609d8bd6b304.png!small1687937621_649be2557609d8bd6b304.png!small

  • 繼續(xù)f7步入,查看parseObject反序列化的具體實現(xiàn)

1687937638_649be2661f477f3ae3cd3.png!small1687937638_649be2661f477f3ae3cd3.png!small

  • 底層對key做了個判斷

1687937659_649be27b4ae64330f43f7.png!small1687937659_649be27b4ae64330f43f7.png!small

  • 繼續(xù)步過可以在底層發(fā)現(xiàn)從當(dāng)前對象的配置中獲取一個用于指定類 'clazz' 的反序列化器,這個clazz就是我們要反序列化的Person類。
ObjectDeserializer deserializer = this.config.getDeserializer(clazz);

1687937707_649be2ab4ca2056ff197f.png!small1687937707_649be2ab4ca2056ff197f.png!small

  1. 回到getDeserializer代碼的實現(xiàn)位置,這里我們重新帶入要反序列化的type(Person類)

1687937723_649be2bbb78f3011e7864.png!small1687937723_649be2bbb78f3011e7864.png!small

  • f8步過,依然是要從當(dāng)前對象的配置中獲取與指定類 'clazz'相關(guān)聯(lián)的反序列化器 ObjectDeserializer

1687937739_649be2cbbdacbf8317390.png!small1687937739_649be2cbbdacbf8317390.png!small

  • f8步過查看 thisObj = deserializer.deserialze(this, clazz, fieldName); 的具體實現(xiàn)
public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        return this.deserialze(parser, type, fieldName, 0);
    }

public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName, int features) {
        return this.deserialze(parser, type, fieldName, (Object)null, features);
    }
  • 相當(dāng)于對Person類做一遍和Object類一樣的調(diào)試,這里的token值為16

1687937757_649be2ddc1bba19ba32ea.png!small1687937757_649be2ddc1bba19ba32ea.png!small

  • f8步過token=16的循環(huán)體

1687937783_649be2f7307263c3af1de.png!small1687937783_649be2f7307263c3af1de.png!small

  • 繼續(xù)步過走到自增fieldIndex

1687937809_649be311a31ab9eaef38f.png!small1687937809_649be311a31ab9eaef38f.png!small

  • 通過多次遞增,直到fileIndex為5

1687937832_649be32871d8efdcca30f.png!small1687937832_649be32871d8efdcca30f.png!small

1687937864_649be3489d454e94368c4.png!small1687937864_649be3489d454e94368c4.png!small

......

1687937882_649be35a80d859b7490fc.png!small1687937882_649be35a80d859b7490fc.png!small

  • 再看這段代碼,判斷當(dāng)前解析操作是否成功,只要解析成功即可彈出計算器
boolean match = this.parseField(parser, key, object, type, fieldValues);
  • 仔細(xì)查看代碼的實現(xiàn)過程
public boolean parseField(DefaultJSONParser parser, String key, Object object, Type objectType, Map<String, Object> fieldValues) {
    //創(chuàng)建了一個JSONLexer對象,并將其初始化為 'parser'對象的 'lexer'屬性
		JSONLexer lexer = parser.lexer;
    //smartMatch方法用于根據(jù)提供的字段名key匹配對應(yīng)的字段解析器
		FieldDeserializer fieldDeserializer = this.smartMatch(key);
  	//創(chuàng)建一個mask的整型變量,并設(shè)置為 'Feature.SupportNonPublicField.mask'的值
    int mask = Feature.SupportNonPublicField.mask;
    if (fieldDeserializer == null && (parser.lexer.isEnabled(mask) || (this.beanInfo.parserFeatures & mask) != 0)) {
        if (this.extraFieldDeserializers == null) {
            ConcurrentHashMap extraFieldDeserializers = new ConcurrentHashMap(1, 0.75F, 1);
            Field[] fields = this.clazz.getDeclaredFields();
            Field[] var11 = fields;
            int var12 = fields.length;
          	//遍歷當(dāng)前類聲明的字段,對每個字段進行一下操作:(1)獲取字段名并檢查是否已存在對應(yīng)的字段解析器;(2)檢查字段的修飾符,判斷是否為非公共字段和非靜態(tài)字段;(3)如果滿足條件,則將字段添加到extraFieldDeserializers中。
            for(int var13 = 0; var13 < var12; ++var13) {
                Field field = var11[var13];
                String fieldName = field.getName();
                if (this.getFieldDeserializer(fieldName) == null) {
                    int fieldModifiers = field.getModifiers();
                    if ((fieldModifiers & 16) == 0 && (fieldModifiers & 8) == 0) {
                        extraFieldDeserializers.put(fieldName, field);
                    }
                }
            }

            this.extraFieldDeserializers = extraFieldDeserializers;
        }

        Object deserOrField = this.extraFieldDeserializers.get(key);
        if (deserOrField != null) {
            if (deserOrField instanceof FieldDeserializer) {
                fieldDeserializer = (FieldDeserializer)deserOrField;
            } else {
                Field field = (Field)deserOrField;
                field.setAccessible(true);
                FieldInfo fieldInfo = new FieldInfo(key, field.getDeclaringClass(), field.getType(), field.getGenericType(), field, 0, 0, 0);
                fieldDeserializer = new DefaultFieldDeserializer(parser.getConfig(), this.clazz, fieldInfo);
                this.extraFieldDeserializers.put(key, fieldDeserializer);
            }
        }
    }
  	//如果fieldDeserializer為空,繼續(xù)判斷:
    if (fieldDeserializer == null) {//如果lexer未啟用Feature.IgnoreNotMatch,拋出異常
        if (!lexer.isEnabled(Feature.IgnoreNotMatch)) {
            throw new JSONException("setter not found, class " + this.clazz.getName() + ", property " + key);
        } else {//否則調(diào)用'parser.parseExtra(object,key)'方法,將額外的字段解析給 object
            parser.parseExtra(object, key);
            return false;//false表示未成功解析字段
        }
    } else {//filedDeserializer不為空,通過下列方法將解析器移到字段值的冒號位置,并解析字段值
        lexer.nextTokenWithColon(((FieldDeserializer)fieldDeserializer).getFastMatchToken());
        ((FieldDeserializer)fieldDeserializer).parseField(parser, object, objectType, fieldValues);
        return true;//返回true表示成功解析
    }
}
  • 此時fieldDeserializer不為空

1687937908_649be374d92b4791d8cc9.png!small1687937908_649be374d92b4791d8cc9.png!small

  • 跟進 ((FieldDeserializer)fieldDeserializer).parseField(parser, object, objectType, fieldValues); 最后使用字段值的反序列化器從解析器中解析字段的值

1687937927_649be3878876a960d1fb7.png!small1687937927_649be3878876a960d1fb7.png!small

  • 繼續(xù)步過,將解析得到的字段值 value 設(shè)置到目標(biāo)對象 object 的對應(yīng)字段上

1687937955_649be3a3ca8f30bead06d.png!small1687937955_649be3a3ca8f30bead06d.png!small

  • 跟進setValue,可以清晰的看見通過反射調(diào)用了Person類的getProperties() throws Exception

1687937974_649be3b66336d9ef07807.png!small1687937974_649be3b66336d9ef07807.png!small

寫作感悟

  1. 調(diào)試的過程,底層其實就是先對Object進行反序列化,再對具體的Person類進行反序列化,中間有一些重復(fù)的過程,當(dāng)然底層有很多過程其實很難一個個去分析出來,重點一定要先自己先調(diào)試完,自己多走幾遍可能就知道它流程了。
  2. 這篇文章寫了大概得有四五天,其實調(diào)試什么的就是跟著代碼往下走,不會的代碼就查詢。這里就是給出了我在調(diào)試過程中遇到的情況,也是想告訴大家代碼審計、代碼調(diào)試就是一個耐心的活。

本文作者:ZavaSec, 轉(zhuǎn)載請注明來自FreeBuf.COM

責(zé)任編輯:武曉燕 來源: FreeBuf.COM
相關(guān)推薦

2023-04-28 09:44:51

Java源碼Native

2009-11-23 19:46:08

ibmdwJava

2010-02-06 15:13:46

ibmdwJava

2017-01-18 20:38:36

LinuxShell腳本命令

2013-05-28 10:52:07

Android開發(fā)移動開發(fā)移動應(yīng)用

2017-04-18 21:54:27

iOSWireShark網(wǎng)絡(luò)請求

2017-08-28 15:29:19

Linux調(diào)試器源碼級逐步執(zhí)行

2024-10-21 10:45:52

2011-09-13 17:44:00

Eclipse And

2021-12-30 08:55:41

Log4j2FastJson漏洞

2021-09-26 09:59:14

MYSQL開發(fā)數(shù)據(jù)庫

2021-03-06 22:41:06

內(nèi)核源碼CAS

2022-07-31 19:57:26

react項目VSCode

2016-10-26 20:49:24

ReactJavascript前端

2021-04-20 23:25:16

執(zhí)行函數(shù)變量

2010-06-03 11:23:19

Hadoop

2022-08-30 07:00:18

執(zhí)行引擎Hotspot虛擬機

2009-12-25 14:03:46

Linux vi

2009-10-20 09:19:11

Linux kill命

2024-06-12 13:36:24

點贊
收藏

51CTO技術(shù)棧公眾號

精品一区二区三区三区| 99精品在线视频观看| 久久综合另类图片小说| 成人网18免费网站| 欧洲激情一区二区| 女女同性女同一区二区三区按摩| 国产jzjzjz丝袜老师水多| 国产精品天天操| 欧亚av在线| 日本天堂在线播放| 日本免费一区视频| 日本不卡视频在线| 久久国产精品偷| 国产a√精品区二区三区四区| 视频国产在线观看| 国产一区二区高清| 亚洲激情在线观看| 欧美综合在线观看视频| 欧美色视频免费| 精品一区二区三区久久| 欧美日韩第一页| 超碰caoprom| 国产精品专区免费| 91色乱码一区二区三区| 一区二区三区视频免费| 日韩久久久久久久久久久| www.九色在线| 亚洲欧洲av一区二区三区久久| 日韩电影中文字幕在线观看| 欧美日韩亚洲精品一区二区三区| 久久99精品久久久久久三级 | 日韩三区免费| 亚洲二区在线观看| 免费在线精品视频| а天堂8中文最新版在线官网| 99久久免费精品高清特色大片| 成人女保姆的销魂服务| 久久99国产综合精品免费| 激情综合亚洲| 久久亚洲欧美日韩精品专区| 蜜桃精品成人影片| 加勒比视频一区| 91精品国产综合久久久久久久久久 | 国产精品丝袜一区二区| 麻豆久久久久| 亚洲www啪成人一区二区麻豆| 在线观看欧美一区| 国产精品四虎| 亚洲国产福利视频| 三级久久三级久久久| 亚洲黄色av女优在线观看| 漂亮人妻被中出中文字幕| 天堂av最新在线| 中文字幕亚洲在| 亚洲成人18| 人人妻人人澡人人爽久久av| 国产剧情一区二区| 国产女同一区二区| www.色国产| 韩国欧美一区| 精品国产一区二区三区四区在线观看| 亚洲熟女一区二区| 99a精品视频在线观看| 欧美一级日韩不卡播放免费| 精品一区二区中文字幕| 日韩av中文| 日本一区二区三区高清不卡| 成人动漫网站在线观看| 一级黄色免费看| 毛片av一区二区| 国产精品爱久久久久久久| 成人欧美一区二区三区黑人孕妇 | 精一区二区三区| 国产经典一区二区| 91美女免费看| 欧美在线精品一区| 欧美国产日韩精品| 日韩成人毛片视频| 成人高潮视频| 欧美日韩五月天| 日本精品久久久久中文字幕| 不卡一二三区| 亚洲国产综合色| 亚洲欧美久久久久一区二区三区| 尤物视频在线免费观看| 国产三级精品三级| 亚洲在线观看视频| 亚洲精品网站在线| 欧美激情第8页| 亚洲深夜福利在线| 91麻豆制片厂| 日韩专区精品| 欧美另类69精品久久久久9999| www亚洲国产| 久久中文字幕精品| 日韩在线看片| 欧美日韩999| 日本一级黄色大片| 韩国久久久久| 国产成人精品av在线| 中文字幕 日韩有码| 日韩精品一卡二卡三卡四卡无卡 | 少妇一区二区三区四区| 国内成人免费视频| 青青草国产精品一区二区| 在线观看日本网站| 国产一区二区伦理| 成人动漫网站在线观看| 狠狠躁日日躁夜夜躁av| 亚洲精品国产av| 国产一区日韩欧美| 日韩福利在线播放| 日本爱爱小视频| 91精品在线观看国产| 国产91精品一区二区麻豆网站 | 国产区视频在线播放| 99久久亚洲一区二区三区青草| 欧美日韩亚洲一区二区三区四区| 搞黄网站在线观看| 欧美日韩一区二区三区 | a篇片在线观看网站| 亚洲午夜电影在线观看| 800av在线免费观看| 99久久亚洲国产日韩美女| 精品少妇一区二区三区在线视频| 亚洲天堂视频一区| 亚洲成人日韩| 国产精品成人av在线| 在线观看免费高清视频| 国产99精品在线观看| 欧美日韩综合网| a级网站在线播放| 精品1区2区3区| 日本xxx在线播放| 人人香蕉久久| 日韩精品福利在线| wwwww黄色| 久久狠狠婷婷| 国产一区在线免费观看| 欧美三电影在线| 午夜精品一区二区三区在线观看| 波多野结衣在线网站| 一区在线播放视频| 亚洲熟妇无码一区二区三区| 国产日韩欧美中文在线| 中文字幕精品国产| 中文字幕视频网| 成人av电影免费在线播放| 日韩精品久久一区二区三区| 大乳在线免费观看| 亚洲一区在线看| 日韩av.com| 欧美3p视频| 国产精品高清在线| 国产高清在线免费| 中文字幕成人av| 久久综合一区二区三区| 精精国产xxxx视频在线| 欧美日韩精品系列| 添女人荫蒂视频| 亚洲国产国产亚洲一二三| 成人免费xxxxx在线观看| 日日骚av一区二区| 久久综合99re88久久爱| 四虎4hu永久免费入口| 人人精品久久| 日韩少妇与小伙激情| 黑鬼大战白妞高潮喷白浆| 啪啪一区二区三区| 91精品国产调教在线观看| 2025国产精品视频| 国产尤物在线观看| 一区二区三区在线视频播放 | 天天操天天干天天干| 欧美激情一区二区三区蜜桃视频| 给我免费播放片在线观看| 韩国一区二区三区视频| 中文字幕亚洲综合久久筱田步美| 国产成人精品一区二区色戒| 国产精品久久久一本精品| 少妇高潮喷水久久久久久久久久| 国产一区二区三区四区五区传媒 | 亚洲精选中文字幕| 91porny九色| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲欧美手机在线| 精品日韩欧美一区| 国产精品pans私拍| 天天摸夜夜添狠狠添婷婷| 色综合夜色一区| 亚洲第一视频区| 国产精品久久久久久久免费| 三级久久三级久久| 中日韩在线视频| 99er精品视频| 精品久久久999| 日本精品久久久久久| 一本一道久久a久久精品综合蜜臀| 一级欧美一级日韩片| 一二三区精品| 亚洲日本精品| 中文久久电影小说| 欧美在线观看网址综合| 在线播放麻豆| 亚洲国产精品va| www.毛片.com| 中文字幕亚洲成人| 成人一区二区av| 欧美变态挠脚心| 日本sm极度另类视频| 国产天堂在线| 91精品久久久久久久久99蜜臂| 久久久久噜噜噜亚洲熟女综合| 日本成人中文字幕| 国产小视频免费| 成人激情诱惑| 91精品国产91久久久久久久久| 午夜精品久久久久久久96蜜桃| 国产精品久久久久久久蜜臀| 在线观看国产免费视频| 蜜臀91精品一区二区三区| 亚洲大片一区二区三区| 青青在线视频免费| 91精品观看| 亚州欧美一区三区三区在线 | 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 91精品免费观看| 丰满少妇xoxoxo视频| 一区二区三区蜜桃| 91亚洲一区二区| 一本一本久久| 亚洲精品成人a8198a| 亚洲小说图片| 国产伦精品一区二区三区照片| 澳门av一区二区三区| 4438全国亚洲精品在线观看视频| 97caopron在线视频| 亚洲欧洲中文天堂| 亚洲国产www| 伊人夜夜躁av伊人久久| 美女福利视频网| 国产午夜精品久久久久久久 | 国产无码精品视频| 国产日产精品一区| 免费观看国产精品视频| 韩国在线视频一区| 国产911在线观看| 三级毛片在线免费看| 视频一区视频二区中文| 国产对白在线播放| 欧美中文一区| 国产精品自产拍在线观看| 久久男人天堂| 欧美老女人xx| a黄色片在线观看| 久久福利视频网| 好了av在线| 欧美xxxx综合视频| 久cao在线| 中文字幕亚洲无线码a| 日本成人动漫在线观看| 在线国产电影不卡| 四虎影院在线免费播放| 在线观看www91| 精品无码免费视频| 亚洲国产成人av网| 日韩精品一区二区在线播放| 亚洲国产日韩一区二区| 亚欧洲精品在线视频| 亚洲精品视频在线观看免费| 182在线视频| 成人免费视频一区| 日本www高清视频| 国产99亚洲| 日韩区国产区| 精品视频日韩| 欧洲成人一区二区| 网曝91综合精品门事件在线| 精品国产一区二区三区麻豆小说 | 亚洲欧洲xxxx| 免费在线观看日韩av| 国产在线国偷精品产拍免费yy| 中文字幕一区久久| 国产激情一区二区三区桃花岛亚洲| 美女被爆操网站| 成人av电影在线| 先锋影音av在线| a亚洲天堂av| 一本色道综合久久欧美日韩精品| 久久精品网站免费观看| 欧美大波大乳巨大乳| 国产三区在线成人av| 国产福利在线导航| 亚洲一二三四在线| 国产一级淫片a视频免费观看| 欧美亚洲高清一区| 人妻中文字幕一区| 国产一区二区三区精品久久久| 色呦呦视频在线| 亚洲国语精品自产拍在线观看| 亚洲中文一区二区三区| 欧美大片一区二区| 在线观看中文字幕av| 精品久久久久久久久久久久久久久 | 国产精品一区二区av交换| 欧美午夜片欧美片在线观看| 亚洲色图14p| 国产日产欧美一区| 久久一区二区三| 日韩欧美综合在线视频| 国产三级第一页| 欧美成人乱码一区二区三区| www.蜜臀av| 一区二区av在线| cao在线视频| 国产精品免费一区二区三区都可以| 欧美激情网站| 国产精品黄页免费高清在线观看| av女名字大全列表| 最新日韩中文字幕| 国产精品xx| 欧美一级片免费在线| 精品亚洲a∨| 国产伦精品一区二区三区| 欧美肉体xxxx裸体137大胆| 一区二区三区电影| 亚洲综合日韩| 性高潮久久久久久| 成人免费在线视频观看| 久久草视频在线| 日韩一区二区精品葵司在线| 西西人体44www大胆无码| www高清在线视频日韩欧美| xxxx在线视频| 国产日韩欧美91| 美女毛片一区二区三区四区最新中文字幕亚洲 | 草民电影神马电影一区二区| 国产一区二中文字幕在线看| 色先锋久久影院av| 国产精品美女久久久久久久久久久| 精品一区二区三孕妇视频| 亚洲国产另类av| 精品国产无码AV| 中文字幕亚洲欧美一区二区三区| zzzwww在线看片免费| 高清国产在线一区| 99精品视频在线观看播放| 午夜精品电影在线观看| 激情久久99| 日韩尤物视频| 亚洲一区中文| 免费毛片网站在线观看| 久久99精品久久久久婷婷| wwwww黄色| 精品视频免费看| 天堂资源在线中文| 国产精品一区二区三| 欧洲美女日日| 欧美aⅴ在线观看| 国产精品996| 国产一级免费观看| 亚洲精品一区二区三区精华液 | www亚洲一区| 日韩av大片在线观看| 亚洲高清色综合| 男人天堂网在线观看| 亚洲少妇激情视频| a欧美人片人妖| 日韩av一级大片| 成人免费一级视频| 欧美午夜www高清视频| 香蕉视频成人在线| 韩国v欧美v日本v亚洲| 色资源二区在线视频| 欧美日韩精品综合| 久久精品国产久精国产爱| 性の欲びの女javhd| 欧美日韩精品电影| 国产日产一区二区三区| 5566中文字幕一区二区电影| 欧美 日韩 国产 成人 在线观看 | 亚洲欧美中文在线视频| 先锋成人av| 99久久免费国| 欧美性色综合| 中文字幕无码人妻少妇免费| 第一福利永久视频精品| 成人精品福利| 亚洲一区二区三区视频播放| 亚洲日本国产| 波多野结衣片子| 在线亚洲人成电影网站色www| 麻豆网站在线| 日韩免费av片在线观看| 欧美激情理论| 绯色av蜜臀vs少妇| 色94色欧美sute亚洲13| 欧美成人xxx| 国产精品2018| 欧美精品91|