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

如何避免出現(xiàn)SQL注入漏洞

安全 應(yīng)用安全 網(wǎng)站安全
本文將針對開發(fā)過程中依舊經(jīng)常出現(xiàn)的SQL編碼缺陷,講解其背后原理及形成原因。

[[424246]]

一、前言

本文將針對開發(fā)過程中依舊經(jīng)常出現(xiàn)的SQL編碼缺陷,講解其背后原理及形成原因。并以幾個(gè)常見漏洞存在形式,提醒技術(shù)同學(xué)注意相關(guān)問題。最后會(huì)根據(jù)原理,提供解決或緩解方案。

二、SQL注入漏洞的原理、形成原因

SQL注入漏洞,根本上講,是由于錯(cuò)把外部輸入當(dāng)作SQL代碼去執(zhí)行。目前最佳的解決方案就是預(yù)編譯的方式。

SQL語句在執(zhí)行過程中,需要經(jīng)過以下三大基本步驟:

  • 代碼語義分析
  • 制定執(zhí)行計(jì)劃
  • 獲得返回結(jié)果

而一個(gè)SQL語句是由代碼和數(shù)據(jù)兩部分,如:

  1. SELECT id, name, phone FROM userTable WHERE name = 'xiaoming';   

SELECT id, name, phone FROM userTable WHERE name = 是代碼,'xiaoming'是數(shù)據(jù)。

而預(yù)編譯,以Mybatis為例,就是預(yù)先分析帶有占位符的語義:

如SELECT id, name, phone FROM userTable WHERE id = #{name};

然后再將數(shù)據(jù)'xiaoming',傳入到占位符。這樣一來,錯(cuò)開來代碼語義分析階段,也就不會(huì)被誤認(rèn)為是代碼的一部分了。

在最早期,開發(fā)者顯式使用JDBC來自己創(chuàng)建Connection,執(zhí)行SQL語句。這種情況下,如果將外部可控?cái)?shù)據(jù)拼接到SQL語句,且沒有做充分過濾的話,就會(huì)產(chǎn)生漏洞。這種情況在正常的業(yè)務(wù)開發(fā)過程中已經(jīng)很少了,按照公司規(guī)定,無特殊情況下,必須使用ORM框架來執(zhí)行SQL。

但目前部分項(xiàng)目中,仍會(huì)使用JDBC來編寫一些工具腳本,如DataMerge.java 、DatabaseClean.java,借用JDBC的靈活性,通過這些腳本來執(zhí)行數(shù)據(jù)庫批量操作。

此類代碼不應(yīng)該出現(xiàn)在線上版本中,以免因各種情況,被外部調(diào)用。

三、直接使用Mybatis

1. 易錯(cuò)點(diǎn)

目前大部分的平臺代碼是基于Mybatis來處理持久層和數(shù)據(jù)庫之間的交互的,Mybatis傳入數(shù)據(jù)有兩種占位符{}和#{}。{}和#{}。{}可以理解為語義分析前的字符串拼接,講傳入的參數(shù),原封不動(dòng)地傳入。

比如說

  1. SELECT id, name, phone FROM userTable WHERE name = '${name}';   

傳入name=xiaoming后,相當(dāng)于

  1. SELECT id, name, phone FROM userTable WHERE name = 'xiaoming';   

實(shí)際應(yīng)用中

  1. SELECT id, name, phone FROM userTable WHERE ${col} = 'xiaoming';   

傳入col = "name",相當(dāng)于

  1. SELECT id, name, phone FROM userTable WHERE name = 'xiaoming';   

就像預(yù)編譯原理介紹里講的一樣,使用#{} 占位符就不存在注入問題了。但有些業(yè)務(wù)場景是不可以直接使用#{}的。

(1) 比如order by語法中

如果編寫SELECT id, name, phone FROM userTable ORDER BY #{}; ,執(zhí)行時(shí)是會(huì)報(bào)錯(cuò)的。因?yàn)閛rder by后的內(nèi)容,是一個(gè)列名,屬于代碼語義的一部分。如果在語義分析部分沒有確定下來,就相當(dāng)于執(zhí)行SELECT id, name, phone FROM userTable ORDER BY 。肯定會(huì)有語法錯(cuò)誤。

(2) 再比如like場景下

 

  1. SELECT id, name, phone FROM userTable WHERE name like '%#{name}%';   

#{}不會(huì)被解析,從而導(dǎo)致報(bào)錯(cuò)。

in 語法和 between語法都是如此,那么如何解決這類問題呢?

2. 正確寫法

(1) order by(group by)語句中使用${}

使用條件判斷

  1. <select id="getUserAndOrder" resultType="Emp" parameterType="Emp"> 
  2.     select * from users where id < #{id} 
  3.     <choose> 
  4.         <when test="order == \"name\""> 
  5.             order by name 
  6.         </when> 
  7.         <when test="order != \"age\""> 
  8.             order by age 
  9.         </when> 
  10.         <otherwise> 
  11.             order by id 
  12.         </otherwise> 
  13.     </choose> 
  14. </select> 

使用全局過濾機(jī)制,限制order by后的變量內(nèi)容只能是數(shù)字、字母、下劃線。

如使用正則過濾:

  1. keywordkeyword = keyword.replaceAll("[^a-zA-Z0-9_\s+]", ""); 

這里需要注意,過濾需要使用白名單,不能使用黑名單,黑名單無法解決注入問題。

(2) LIKE語句

由于需要like中的關(guān)鍵詞需要包裹在兩個(gè)%符號中,因此可以使用CONCAT函數(shù)進(jìn)行拼接。

  1. <select id="selectStudentByFuzzyQuery" resultMap="studentMap"> 
  2.     SELECT * 
  3.     FROM student 
  4.     WHERE student.stu_name 
  5.             LIKE CONCAT('%',#{stuName},'%') 
  6. </select> 

注意不要用 CONCAT('%','${stuName}','%') ,這樣仍然存在漏洞。也就是說,使用$符號是不對的,使用#符號才安全。

(3) IN語句

類似于like語句,直接使用#{}會(huì)報(bào)錯(cuò),常見的錯(cuò)誤寫法為:

  1. tenant_id in (${tenantIds}) 

正確的寫法為:

  1. select * from news where id in 
  2. <foreach collection="ids" item="item" open="("separator="," close=")">#{item}</foreach> 

四、Mybatis-generator使用安全

繁重的CRUD代碼壓力下,開發(fā)者慢慢開始通過Mybatis-generator、idea-mybatis-generator插件、通用Mapper、Mybatis-generator-plus來自動(dòng)生成Mapper、POJO、Dao等文件。

這些工具可以自動(dòng)的生成CRUD所需要的文件,但如果使用不當(dāng),就會(huì)自動(dòng)產(chǎn)生SQL注入漏洞。我們以最常用的org.mybatis.generator為例,來講解可能會(huì)出現(xiàn)的問題。

1. 動(dòng)態(tài)語句支持

Mybatis-generator提供來一些函數(shù),幫助用戶把SQL的各個(gè)條件連接起來,比如多個(gè)參數(shù)的like語法,多個(gè)參數(shù)的比較語法。為了保證使用的簡潔性,需要使用將一些語義代碼拼接到SQL語句中。而如果開發(fā)者使用不當(dāng),將外部輸入也傳入了{(lán)}占位符。就會(huì)產(chǎn)生漏洞。

2. targetRuntime參數(shù)配置

在配置generator時(shí),配置文件generator-rds.xml中有一個(gè)targetRuntime屬性,默認(rèn)為MyBatis3。在這種情況下,會(huì)啟動(dòng)Mybatis的動(dòng)態(tài)語句支持,啟動(dòng)enableSelectByExample、enableDeleteByExample、enableCountByExample 以及 enableUpdateByExample功能。

以enableSelectByExample為例,會(huì)在xml映射文件中代入以下動(dòng)態(tài)模塊:

  1. <sql id="Example_Where_Clause" > 
  2.   <where > 
  3.     <foreach collection="oredCriteria" item="criteria" separator="or" > 
  4.       <if test="criteria.valid" > 
  5.         <trim prefix="(" suffix=")" prefixOverrides="and" > 
  6.           <foreach collection="criteria.criteria" item="criterion" > 
  7.             <choose > 
  8.               <when test="criterion.noValue" > 
  9.                 and ${criterion.condition} 
  10.               </when> 
  11.               <when test="criterion.singleValue" > 
  12.                 and ${criterion.condition} #{criterion.value} 
  13.               </when> 
  14.               <when test="criterion.betweenValue" > 
  15.                 and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} 
  16.               </when> 
  17.               <when test="criterion.listValue" > 
  18.                 and ${criterion.condition} 
  19.                 <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," > 
  20.                   #{listItem} 
  21.                 </foreach> 
  22.               </when> 
  23.             </choose> 
  24.           </foreach> 
  25.         </trim> 
  26.       </if> 
  27.     </foreach> 
  28.   </where> 
  29. </sql> 

開發(fā)者include該模塊就可以添加where條件,但如果使用不當(dāng),就會(huì)導(dǎo)致SQL注入漏洞:

  1. <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.doctor.mybatisdemo.domain.userExample" > 
  2.     select 
  3.     <if test="distinct" > 
  4.       distinct 
  5.     </if> 
  6.     <include refid="Base_Column_List" /> 
  7.     from user 
  8.     <if test="_parameter != null" > 
  9.       <include refid="Example_Where_Clause" /> 
  10.     </if> 
  11.     <if test="orderByClause != null" > 
  12.       order by ${orderByClause} 
  13.     </if> 
  14.   </select> 

并使用自定義的參數(shù)添加函數(shù):

  1. public Criteria addKeywordTo(String keyword) { 
  2.   StringBuilder sb = new StringBuilder(); 
  3.   sb.append("(display_name like '%" + keyword + "%' or "); 
  4.   sb.append("org like '" + keyword + "%' or "); 
  5.   sb.append("status like '%" + keyword + "%' or "); 
  6.   sb.append("id like '" + keyword + "%') "); 
  7.   addCriterion(sb.toString()); 
  8.   return (Criteria) this; 

目的是為了實(shí)現(xiàn)同時(shí)對display_name、org、status、id的like操作。其中addCriterion是Mybatis-generator自帶的函數(shù):

  1. protected void addCriterion(String condition) { 
  2.     if (condition == null) { 
  3.         throw new RuntimeException("Value for condition cannot be null"); 
  4.     } 
  5.     criteria.add(new Criterion(condition)); 

這里的誤區(qū)在于,addCriterion本身提供了多個(gè)條件的支持,但開發(fā)者認(rèn)為需要自己把多個(gè)條件拼接起來,一同傳入addCriterion方法。如同案例中的代碼一樣,最終傳入addCriterion的只有一個(gè)參數(shù)。從而執(zhí)行Example_Where_Clause語句中的:

  1. <when test="criterion.noValue" > 
  2.     and ${criterion.condition} 
  3. </when> 

也就是說,開發(fā)者把自己拼接的SQL語句,直接代入了${criterion.condition}中,從而導(dǎo)致了漏洞的產(chǎn)生。

而按照Mybatis-generator的文檔,正確的寫法應(yīng)該是:

  1. public void addKeywordTo(String keyword, UserExample userExample) { 
  2.   userExample.or().andDisplayNameLike("%" + keyword + "%"); 
  3.   userExample.or().andOrgLike(keyword + "%"); 
  4.   userExample.or().andStatusLike("%" + keyword + "%"); 
  5.   userExample.or().andIdLike("%" + keyword + "%"); 

or方法負(fù)責(zé)創(chuàng)建Criteria,這時(shí)觸發(fā)的邏輯就是

  1. <when test="criterion.singleValue" > 
  2.   and ${criterion.condition} #{criterion.value} 
  3. </when> 

${criterion.condition}被替換為了沒有單引號的like,like作為語義代碼,在語義分析前拼接到了SQL語句中,而"%" + keyword + "%"會(huì)作為數(shù)據(jù)添加到預(yù)編譯#{criterion.value}中去,從而避免了注入。

類似的,也提供了In語法的安全使用方法:

  1. List<Integer> field5Values = new ArrayList<Integer>(); 
  2. field5Values.add(8); 
  3. field5Values.add(11); 
  4. field5Values.add(14); 
  5. field5Values.add(22); 
  6.  
  7. example.or() 
  8.   .andField5In(field5Values); 

Beetween的安全使用方法:

  1. example.or() 
  2.   .andField6Between(3, 7); 

Mybatis-generator默認(rèn)生成的order by語句也是使用${}直接進(jìn)行拼接的:

  1. <if test="orderByClause != null" > 
  2.       order by ${orderByClause} 
  3.     </if> 

如果沒有對傳入的參數(shù)進(jìn)行額外的過濾的話,就會(huì)導(dǎo)致注入問題。

3. order by

除了自己寫的SQL語句以外,Mybatis-generator默認(rèn)生成的order by語句也是使用${}直接進(jìn)行拼接的:

  1. <if test="orderByClause != null" > 
  2.       order by ${orderByClause} 
  3.     </if> 

如果沒有對傳入的參數(shù)進(jìn)行額外的過濾的話,就會(huì)導(dǎo)致注入問題。

PS: 實(shí)際掃雷過程中發(fā)現(xiàn)很多語句自動(dòng)生成了order by語法,但上層調(diào)用時(shí),并沒有傳入該可選參數(shù)。這種情況應(yīng)當(dāng)刪除多余的order by語法。

4. 其它插件

插件與插件之間的安全缺陷還不太一樣,下面簡單列舉了常用的幾種插件。

(1) idea-mybatis-generator

這是IDEA的插件,可以在開發(fā)過程中,從IDE的層面,自動(dòng)生成CRUD中需要的文件。使用該插件時(shí),也有一些默認(rèn)安全隱患需要注意。

1)自定義order by處理

like\in\between可以參照官方文檔使用,無安全隱患。

但該插件沒有內(nèi)置的order by處理,需要自行編寫,編寫時(shí),參考Case2

2)默認(rèn)的IF條件前需要判斷是否為空

插件默認(rèn)生成的語法大致如下:

  1. <if test="ID != null"> 
  2. ID = #{ID} and 

當(dāng)ID參數(shù)為null時(shí),if標(biāo)簽下的邏輯不會(huì)添加到SQL語句中,可能會(huì)導(dǎo)致DOS、權(quán)限繞過等漏洞。因此,參數(shù)傳入查詢語句前,需要確認(rèn)不為空。

(2) com.baomidou.mybatis-plus

  • apply方法傳參時(shí),應(yīng)當(dāng)使用{}
  • 自帶的last方法,其原理是直接拼接到SQL語句的末尾,存在注入漏洞。

五、其它ORM框架

1. Hibernate

ORM全稱為對象關(guān)系映射(Object Relational Mapping),簡單地說,就是將數(shù)據(jù)庫中的表映射為Java對象, 這種只有屬性,沒有業(yè)務(wù)邏輯的對象也叫做POJO(Plain Ordinary Java Object)對象。

Hibernate是第一個(gè)被廣泛使用的ORM框架,它通過XML管理數(shù)據(jù)庫連接,提供全表映射模型,封裝程度很高。在配置映射文件和數(shù)據(jù)庫鏈接文件后,Hibernate就可以通過Session對象進(jìn)行數(shù)據(jù)庫操作,開發(fā)者無需接觸SQL語句,只需要寫HQL語句即可。

Hibernate經(jīng)常與Struts、Spring搭配使用,也就是Java世界的經(jīng)典SSH框架。

HQL相較于SQL,多了很多語法限制:

  • 不能查詢未做映射的表,只有當(dāng)模型之間的關(guān)系明確后,才可以使用UNION語法。
  • 表名,列名大小寫敏感。
  • 沒有*、#、-- 。
  • 沒有延時(shí)函數(shù)。

所以HQL注入利用要比SQL注入苦難得多。從代碼審計(jì)的角度和普通SQL注入是一致的:

拼接會(huì)導(dǎo)致注入漏洞:

  1. List<Student> studentList = session.createQuery("FROM Student s WHERE s.stuId = " + stuId).list(); 

可以使用占位符和具名參數(shù)來防止SQL語句,其本質(zhì)都是預(yù)編譯。

  1. List<Student> studentList = session.createQuery("FROM Student s WHERE s.stuId = :stuId").setParameter("stuId",stuId).list(); 
  1. List<Student> studentList = session.createQuery("FROM Student s WHERE s.stuId = ?").setParameter(stuId).list(); 

Hibernate在使用過程中有很多不足:

  • 全表映射不靈活,更新時(shí)需要發(fā)送所有字段,影響程序運(yùn)行效率。
  • 對復(fù)雜查詢的支持很差。
  • 對存儲過程的支持很差。
  • HQL性能較差,無法根據(jù)SQL進(jìn)行優(yōu)化。

在審計(jì)Hibernate相關(guān)注入時(shí),可以通過全局搜索createQuery來快速定位SQL操作的位置。

2. JPA

JPA全稱為Java Persistence API,是Java EE提供的一種數(shù)據(jù)持久化的規(guī)范,允許開發(fā)者通過XML或注解的方式,將某個(gè)對象,持久化到數(shù)據(jù)庫中。

主要包括三方面內(nèi)容:

(1) ORM映射元數(shù)據(jù),通過XML或注解,描述對象和數(shù)據(jù)表之間的對應(yīng)關(guān)系。框架便可以自動(dòng)將對象中的數(shù)據(jù)保存到數(shù)據(jù)庫中。

常見的注解有:@Entity、@Table、@Column、@Transient

(2) 數(shù)據(jù)操作API,內(nèi)置接口,方便對某個(gè)數(shù)據(jù)表執(zhí)行CRUD操作,節(jié)省開發(fā)者編寫SQL的時(shí)間。

常見的方法有:entityManager.merge(T t);

(3) JPQL, 提供一種面向?qū)ο蠖皇敲嫦驍?shù)據(jù)庫的查詢語言,將程序和數(shù)據(jù)庫、SQL解耦合。

JPA是一套規(guī)范,Hibernate實(shí)現(xiàn)了這一JPA規(guī)范。

在Spring框架中,提供了簡易版的JPA實(shí)現(xiàn)——spirng data jpa。按照約定好的方法命名規(guī)則寫dao層接口,就可以在不寫接口實(shí)現(xiàn)的情況下,實(shí)現(xiàn)對數(shù)據(jù)庫的訪問和操作。同時(shí)提供了很多除了CRUD之外的功能,如分頁、排序、復(fù)雜查詢等等。使用起來更簡單,但底層仍然在使用Hibernate的JPA實(shí)現(xiàn)。

和HQL注入一樣,如果使用拼接的方式,將用戶可控的數(shù)據(jù)代入了查詢語句中,就會(huì)導(dǎo)致SQL注入。

安全的查詢應(yīng)該使用預(yù)編譯技術(shù)。

Spring Data JPA的預(yù)編譯寫法為:

  1. String getUser = "SELECT username FROM users WHERE id = ?"
  2. Query query = em.createNativeQuery(getUser); 
  3. query.setParameter(1, id); 
  4. String username = query.getResultList(); 

小貼士:其實(shí)Hibernate的出現(xiàn)日期比JPA規(guī)范要早,Hibernate逐漸成熟之后,JavaEE的開發(fā)團(tuán)隊(duì),邀請Hibernate核心開發(fā)人員一起制定了JPA規(guī)范。之后Spring Data JPA按照規(guī)范做了進(jìn)一步優(yōu)化。除此之外,JPA規(guī)范的實(shí)現(xiàn)有很多產(chǎn)品,比如Eclipse的TopLink(OracleLink)。

六、 總結(jié)

經(jīng)過上面的介紹,尤其是圍繞Mybatis易錯(cuò)點(diǎn)的討論,我們可以得到以下結(jié)論:

  • 持久層組件種類繁多。
  • 開發(fā)者對工具使用的錯(cuò)誤理解,是漏洞出現(xiàn)的主要原因。
  • 由于自動(dòng)生成插件的動(dòng)態(tài)特性,自動(dòng)化發(fā)現(xiàn)SQL漏洞不能簡單地使用${}來尋找。必須要根據(jù)全局的持久層組件特性,來做詳細(xì)的匹配規(guī)則。

【本文為51CTO專欄作者“阿里巴巴官方技術(shù)”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】

戳這里,看該作者更多好文

 

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2020-02-19 10:45:04

開發(fā)技能代碼

2010-10-22 15:18:18

SQL注入漏洞

2009-02-12 10:14:16

2009-11-02 13:47:09

2009-10-25 13:32:09

2010-07-14 09:52:50

SQL Server服

2011-12-26 11:22:48

2012-12-19 10:36:06

2009-06-03 15:23:18

Struts教程亂碼

2022-04-06 09:28:04

漏洞SQL注入

2018-03-29 10:16:04

2014-12-04 15:01:13

2023-12-01 16:21:42

2009-10-23 13:08:23

2012-04-12 15:06:44

2010-09-08 13:42:06

2017-05-02 09:02:14

2022-02-07 19:17:56

SQL系統(tǒng)MySQL

2014-10-11 11:44:02

2013-07-27 14:14:25

點(diǎn)贊
收藏

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

欧美韩国日本| 91精彩视频在线观看| 99热这里只有精品8| 国产视频在线观看一区二区| 亚洲 中文字幕 日韩 无码| 秋霞影院午夜丰满少妇在线视频| 国产福利精品一区| 日本成熟性欧美| 在线免费看av网站| 免费成人高清在线视频theav| 欧美性xxxxxx少妇| 久久综合久久网| 天堂中文8资源在线8| 99久久精品情趣| 成人精品久久久| 中文字幕激情小说| 欧美国产先锋| 在线观看国产精品日韩av| 久草视频福利在线| 亚洲日韩中文字幕一区| 色悠久久久久综合欧美99| 玖玖精品在线视频| av女优在线| 99免费精品视频| 亚洲mm色国产网站| 加勒比在线一区| 99精品国产在热久久婷婷| 久久精品中文字幕| 日本一道本视频| 天堂av一区二区三区在线播放| 7777精品久久久大香线蕉| 日本三级免费观看| segui88久久综合9999| 最新热久久免费视频| 日韩性感在线| 日本不卡视频一区二区| 成人综合婷婷国产精品久久蜜臀| 成人国产在线激情| 波多野结衣大片| 亚洲欧美日本日韩| 欧亚精品在线观看| 日本学生初尝黑人巨免费视频| 一区二区影视| 久久久国产影院| 五月婷婷婷婷婷| 欧美色图国产精品| 亚洲欧美制服第一页| 久久午夜夜伦鲁鲁片| 精品国产午夜肉伦伦影院| 欧美成人女星排名| 免费在线观看日韩av| 国产精品777777在线播放| 欧美日本国产视频| 看看黄色一级片| 精品精品视频| 日韩女优毛片在线| 亚洲成a人无码| 丁香五月缴情综合网| 亚洲白拍色综合图区| 久久久久久婷婷| 久久久久久久久久久久久久久久久久久久| 日韩欧美色综合网站| 亚洲丝袜在线观看| 美国十次综合久久| 日韩欧美国产综合在线一区二区三区| 亚洲精品第三页| 亚洲超碰在线观看| 亚洲精品国产综合久久| 国产在线观看无码免费视频| 在线日韩一区| 中文字幕精品国产| 曰本女人与公拘交酡| 亚洲激情午夜| 欧美一区二区大胆人体摄影专业网站| 黄色片视频免费| 免费人成网站在线观看欧美高清| 91精品国产综合久久香蕉| 99国产在线播放| 成人网在线免费视频| 久久综合九色99| 91.xxx.高清在线| 亚洲欧洲综合另类| 欧美 日韩 国产在线观看| 欧美精品高清| 欧美成人女星排名| 波多野结衣 在线| 91精品一区国产高清在线gif| 欧美大片欧美激情性色a∨久久| 国产精品1234区| 久久人人精品| 亚洲aa在线观看| 三级视频在线| 亚洲欧美综合色| 精品少妇在线视频| 欧美与亚洲与日本直播| 日韩欧美亚洲另类制服综合在线| 一级特级黄色片| 日韩理论电影| 97在线免费观看| 一级黄色大片免费观看| 99久免费精品视频在线观看| 亚洲精品成人自拍| heyzo在线播放| 欧美日韩成人一区二区| 亚洲啪av永久无码精品放毛片| 国产伦一区二区三区| 欧美高清视频免费观看| 国产一级精品毛片| av在线一区二区三区| 亚洲欧洲国产日韩精品| 日本不卡1234视频| 日韩欧美国产综合| 日本午夜精品视频| 免费在线观看成人av| 97超碰人人看人人| 在线观看免费网站黄| 精品久久久久久国产91| 国产探花一区二区三区| 日韩欧美精品一区| 日本欧美黄网站| 人人妻人人澡人人爽久久av| 亚洲视频精选在线| 欧美三级理论片| 亚洲区小说区图片区qvod| 久久久久久久国产精品视频| 国产免费无遮挡| 中文字幕av一区二区三区免费看 | 日韩高清欧美| 57pao国产成人免费| 丰满岳乱妇国产精品一区| 国产精品国产三级国产| 久久久精品三级| 一区二区三区韩国免费中文网站| 久久久亚洲欧洲日产国码aⅴ| 国产一区二区三区视频免费观看| 中文字幕免费不卡| 99久久国产宗和精品1上映| 免费日韩一区二区三区| 韩剧1988在线观看免费完整版| 亚洲第一视频在线| 亚洲激情在线激情| 91丨porny丨九色| 一级毛片免费高清中文字幕久久网| 国产精品一区二区三| av电影在线观看网址| 在线免费观看不卡av| 免费人成又黄又爽又色| 久久一二三四| 日韩亚洲视频| 日韩亚洲国产免费| 久久久精品2019中文字幕神马| 一区二区三区免费在线| 国产精品久久久一本精品| 牛夜精品久久久久久久| 成人精品天堂一区二区三区| 国产精品流白浆视频| av电影在线播放高清免费观看| 欧美三级三级三级爽爽爽| 一级二级黄色片| 久久99久久99小草精品免视看| 在线播放 亚洲| 欧美成年网站| 久久久久久久成人| 亚洲aaaaaaa| 在线中文字幕一区| 5566中文字幕| 国产精品羞羞答答xxdd| 999一区二区三区| 校园春色另类视频| 国产精品久久久久久网站| 91ph在线| 欧美sm美女调教| 精品成人久久久| 国产欧美va欧美不卡在线| 又色又爽又黄视频| 激情欧美日韩| 日本一区免费在线观看| 亚洲网站三级| 久久久亚洲天堂| 成黄免费在线| 日韩一级在线观看| 中文字幕在线观看视频网站| 国产亚洲精品7777| 中文字幕无码毛片免费看| 日韩五码在线| 婷婷久久五月天| 盗摄牛牛av影视一区二区| 日韩女优人人人人射在线视频| 成人在线观看免费| 欧美一级在线免费| 亚洲熟女综合色一区二区三区| 国产精品亲子乱子伦xxxx裸| 成人三级做爰av| 天堂一区二区在线| 国产在线无码精品| 国产精品片aa在线观看| 147欧美人体大胆444| 国产精品专区免费| 欧美成人免费视频| 九九九伊在人线综合| 欧美一区二区三区的| 亚洲成人第一网站| 亚洲综合图片区| ass极品国模人体欣赏| 不卡影院免费观看| 国产三级生活片| 久久99伊人| 欧妇女乱妇女乱视频| 成人婷婷网色偷偷亚洲男人的天堂| 成人综合av网| 成人噜噜噜噜| 国产精品美女网站| 松下纱荣子在线观看| 久久99视频免费| 亚洲s色大片| 亚洲欧洲av一区二区| 欧美视频在线观看一区二区三区| 欧美精品自拍偷拍动漫精品| 亚洲精品中文字幕乱码三区91| 亚洲曰韩产成在线| 中文字幕91视频| 国产视频在线观看一区二区三区| 中文字幕永久免费| 国产一区在线不卡| 亚洲欧美自拍另类日韩| 老牛嫩草一区二区三区日本| 成人网站免费观看入口| 欧美视频二区| 穿情趣内衣被c到高潮视频| 欧美岛国激情| 日韩影视精品| 国产精品探花在线观看| 精品蜜桃传媒| 美女扒开腿让男人桶爽久久动漫| 99国产精品久久久久老师| 国产美女亚洲精品7777| 国产一区二区在线免费视频| 成人在线免费| 91精品久久久久久综合乱菊| 国模视频一区| 国产精品扒开腿做| 精品欧美一区二区三区在线观看 | 日韩网站免费观看高清| 国产中文字幕在线播放| 国产偷国产偷亚洲清高网站| 亚洲精品成人电影| 亚洲成人在线视频播放| 人人妻人人玩人人澡人人爽| 亚洲国产三级网| 欧洲亚洲在线| 国产一区二区动漫| 在线免费观看黄色av| 久久深夜福利免费观看| 性xxxxfjsxxxxx欧美| 久久久久久有精品国产| 岛国在线视频网站| 欧美亚洲成人xxx| 色婷婷综合久久久中字幕精品久久 | 欧美日韩成人综合| 精品久久无码中文字幕| 亚洲成人av在线播放| 天堂中文字幕在线| 伊人久久久久久久久久| 色哟哟免费在线观看 | 欧美精品在线一区| blacked蜜桃精品一区| 亚洲一区bb| 国内自拍一区| 日韩精品视频久久| 蜜臀久久久99精品久久久久久| 91亚洲精品久久久蜜桃借种| 国产精品一区二区久久不卡| 亚洲乱妇老熟女爽到高潮的片| 92国产精品观看| 国产综合精品久久久久成人av| 亚洲欧美自拍偷拍| 国产香蕉视频在线| 欧美日韩精品福利| 丰满人妻一区二区三区四区53| 日韩精品免费在线视频| av午夜在线| 午夜精品免费视频| 国产69精品久久久久按摩| 97se国产在线视频| 精品国产一区二区三区香蕉沈先生| 一区二区三区久久网| 亚洲激情国产| 制服丝袜中文字幕第一页| 波波电影院一区二区三区| 中文字幕伦理片| 亚洲国产一区二区三区青草影视| 欧美a视频在线观看| 日韩欧美一级精品久久| 国产三级在线| 午夜精品久久久久久久99黑人| 日韩漫画puputoon| 国产伦理久久久| 久久亚洲精品中文字幕蜜潮电影| 你真棒插曲来救救我在线观看| 人人超碰91尤物精品国产| 成人区人妻精品一区二| 国产精品久久久久久亚洲毛片| 精品91久久久| 欧美一区二区视频免费观看| 十九岁完整版在线观看好看云免费| 色噜噜狠狠狠综合曰曰曰88av| 咪咪网在线视频| 91久久夜色精品国产网站| 国产成人精品免费视| 国产一区二区三区小说| 极品少妇一区二区| 免费看污片的网站| 黄色91在线观看| 国产成人麻豆精品午夜在线| 一区二区三区 在线观看视| 国产传媒在线观看| 99视频在线| 天天综合一区| 无限资源日本好片| 久久色中文字幕| 国产69精品久久久久久久久久| 欧美一区三区四区| 素人av在线| 国产美女搞久久| 精品视频黄色| 国产精品涩涩涩视频网站| 91亚洲精品久久久蜜桃| 久久综合色综合| 日韩精品一区二区三区在线播放| 日韩理伦片在线| 国产精品日韩在线| 精品国产视频| 99免费视频观看| 久久综合国产精品| 五月天婷婷激情| 国产午夜精品麻豆| 欧美aaaaa性bbbbb小妇| 精品国产福利| 亚洲一区二区三区免费在线观看| 亚洲精品无码一区二区| 一区二区三区中文在线观看| 国产精品视频一二区| 日韩亚洲第一页| av在线亚洲一区| 香蕉视频免费版| 国产精品一卡二卡在线观看| 男女做暖暖视频| 日韩美女一区二区三区四区| 午夜dj在线观看高清视频完整版| 亚洲free性xxxx护士白浆| 欧美三级黄美女| 亚洲一级av无码毛片精品| 精品二区三区线观看| 色就是色亚洲色图| 国产精品久久久久久久久粉嫩av | 人妻激情另类乱人伦人妻 | 女人又爽又黄免费女仆| 日本精品一区二区三区四区的功能| 国产高清在线观看| 国产在线视频91| 欧美日韩一区自拍| 精品一区二区视频在线观看| 日韩欧美亚洲综合| 成年在线电影| 91文字幕巨乱亚洲香蕉| 99精品视频免费观看视频| 成人黄色a级片| 在线综合+亚洲+欧美中文字幕| 最新av在线播放| 国产综合 伊人色| 日韩av中文在线观看| 国产精品精品软件男同| 亚洲成人黄色在线| 午夜精品成人av| 国产a级片免费看| av在线不卡免费看| 中文字幕一区二区三区波野结| 久久中国妇女中文字幕| 久久丝袜视频| 久久国产这里只有精品| 亚洲免费伊人电影| 天堂av在线资源| 成人日韩av在线| 在线视频观看日韩| 一级黄色性视频| 日韩精品中文字幕一区二区三区| 中文字幕在线免费观看视频| 一区二区精品国产| 99久久久国产精品| 国产一区二区三区中文字幕| 久久久久久久久久久91| 成人羞羞视频播放网站| 亚洲一区和二区| 欧美裸体一区二区三区| 美女高潮在线观看| 最新黄色av网站| 国产色爱av资源综合区| 亚洲精品综合网| 国产美女直播视频一区| 99成人精品|