使用過濾器解決SQL注入和跨站點腳本編制

1 SQL注入砂豌、盲注

1.1 SQL注入、盲注概述

Web 應(yīng)用程序通常在后端使用數(shù)據(jù)庫绳瘟,以與企業(yè)數(shù)據(jù)倉庫交互樟遣。查詢數(shù)據(jù)庫事實上的標準語言是 SQL(各大數(shù)據(jù)庫供應(yīng)商都有自己的不同版本)而叼。Web 應(yīng)用程序通常會獲取用戶輸入(取自 HTTP 請求),將它并入 SQL 查詢中豹悬,然后發(fā)送到后端數(shù)據(jù)庫葵陵。接著應(yīng)用程序便處理查詢結(jié)果,有時會向用戶顯示結(jié)果瞻佛。 如果應(yīng)用程序?qū)τ脩簦ü粽撸┑妮斎胩幚聿粔蛐⌒耐迅荩粽弑憧梢岳眠@種操作方式。在此情況下伤柄,攻擊者可以注入惡意的數(shù)據(jù)绊困,當(dāng)該數(shù)據(jù)并入 SQL 查詢中時,就將查詢的原始語法更改得面目全非适刀。例如秤朗,如果應(yīng)用程序使用用戶的輸入(如用戶名和密碼)來查詢用戶帳戶的數(shù)據(jù)庫表,以認證用戶笔喉,而攻擊者能夠?qū)阂鈹?shù)據(jù)注入查詢的用戶名部分(或密碼部分)取视,查詢便可能更改成完全不同的數(shù)據(jù)復(fù)制查詢硝皂,可能是修改數(shù)據(jù)庫的查詢,或在數(shù)據(jù)庫服務(wù)器上運行 Shell 命令的查詢贫途。

1.2 安全風(fēng)險及原因

高風(fēng)險漏洞吧彪,攻擊者可能會查看、修改或刪除數(shù)據(jù)庫條目和表

原因:未對用戶輸入正確執(zhí)行危險字符清理

固定值: 查看危險字符注入的可能解決方案

1.3 AppScan掃描建議

若干問題的補救方法在于對用戶輸入進行清理丢早。 通過驗證用戶輸入未包含危險字符,便可能防止惡意的用戶導(dǎo)致應(yīng)用程序執(zhí)行計劃外的任務(wù)秧倾,例如:啟動任意 SQL 查詢怨酝、嵌入將在客戶端執(zhí)行的 Javascript 代碼、運行各種操作系統(tǒng)命令那先,等等农猬。 建議過濾出所有以下字符:

[1] |(豎線符號)

[2] & (& 符號)

[3];(分號)

[4] $(美元符號)

[5] %(百分比符號)

[6] @(at 符號)

[7] '(單引號)

[8] "(引號)

[9] '(反斜杠轉(zhuǎn)義單引號)

[10] "(反斜杠轉(zhuǎn)義引號)

[11] <>(尖括號)

[12] ()(括號)

[13] +(加號)

[14] CR(回車符,ASCII 0x0d)

[15] LF(換行售淡,ASCII 0x0a)

[16] ,(逗號)

[17] (反斜杠)

以下部分描述各種問題斤葱、問題的修訂建議以及可能觸發(fā)這些問題的危險字符:

SQL 注入和 SQL 盲注: A. 確保用戶輸入的值和類型(如 Integer、Date 等)有效揖闸,且符合應(yīng)用程序預(yù)期揍堕。 B. 利用存儲過程,將數(shù)據(jù)訪問抽象化汤纸,讓用戶不直接訪問表或視圖衩茸。當(dāng)使用存儲過程時,請利用 ADO 命令對象來實施它們贮泞,以強化變量類型楞慈。 C. 清理輸入以排除上下文更改符號,例如:

[1] '(單引號)

[2] "(引號)

[3] '(反斜線轉(zhuǎn)義單引號)

[4] "(反斜杠轉(zhuǎn)義引號)

[5] )(結(jié)束括號)

[6] ;(分號)

跨站點腳本編制: A. 清理用戶輸入啃擦,并過濾出 JavaScript 代碼囊蓝。我們建議您過濾下列字符:

[1] <>(尖括號)

[2] "(引號)

[3] '(單引號)

[4] %(百分比符號)

[5] ;(分號)

[6] ()(括號)

[7] &(& 符號)

[8] +(加號)

LDAP 注入: A. 使用正面驗證。字母數(shù)字過濾(A..Z,a..z,0..9)適合大部分 LDAP 查詢令蛉。 B. 應(yīng)該過濾出或進行轉(zhuǎn)義的特殊 LDAP 字符:

[1] 在字符串開頭的空格或"# “字符

[2] 在字符串結(jié)尾的空格字符

[3] ,(逗號)

[4] +(加號)

[5] "(引號)

[6] (反斜杠)

[7] <>(尖括號)

[8] ;(分號)

[9] ()(括號)

ORM 注入: A. 確保用戶輸入的值和類型(如 Integer聚霜、Date 等)有效,且符合應(yīng)用程序預(yù)期言询。 B. 利用存儲過程俯萎,將數(shù)據(jù)訪問抽象化,讓用戶不直接訪問表或視圖运杭。 C. 使用參數(shù)化查詢 API D. 清理輸入以排除上下文更改符號夫啊,例如: (*):

[1] '(單引號)

[2] "(引號)

[3] '(反斜線轉(zhuǎn)義單引號)

[4] "(反斜杠轉(zhuǎn)義引號)

[5] )(結(jié)束括號)

[6] ;(分號)

1.4 應(yīng)用程序解決方案

1、我們?yōu)榱苏{(diào)試方便辆憔,在頁面上會拋出數(shù)據(jù)庫異常信息撇眯,如果入侵工具獲取了這些信息报嵌,就可以獲取系統(tǒng)的一些配置信息,如web系統(tǒng)框架熊榛、采用的數(shù)據(jù)庫等锚国,從而找出系統(tǒng)漏洞。所以不要在頁面上拋出異常的詳細信息玄坦,這些信息對客戶并沒有用血筑,只是方便技術(shù)人員調(diào)試罷了,處理方法是在異常處理頁面把打印異常代碼刪除即可煎楣;

2豺总、新建一個過濾器,通過過濾器過濾SQL注入特殊字符择懂,配置成功后喻喳,重啟服務(wù),用Appsan工具掃描困曙,漏洞得到解決表伦。

通過過濾器可以解決SQL注入、跨站點腳本編制及通過框架釣魚等問題慷丽,具體實現(xiàn)方式如下:

1蹦哼、在web.xml文件中配置過濾器

<!--配置過濾器 通過過濾器過濾SQL注入特殊字符  -->

    <filter>
        <filter-name>InjectFilter</filter-name>
        <filter-class>com.filter.InjectFilter</filter-class>
    </filter>
    <!--映射過濾器-->

    <!--<filter-mapping>
      <filter-name>InjectFilter</filter-name>-->
        <!--"/*"表示攔截所有的請求 -->
       <!-- <url-pattern>/*</url-pattern>
    </filter-mapping>-->

    <filter-mapping>
      <filter-name>InjectFilter</filter-name>
        <!--"/*"表示攔截所有的請求 -->
       <url-pattern>/*</url-pattern>
    </filter-mapping>






**2、過濾器過濾代碼**




package com.filter;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Enumeration;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.Filter;
import javax.servlet.http.HttpServlet;

/**
*  通過過濾器過濾SQL注入特殊字符  
* */
public  class InjectFilter extends HttpServlet implements Filter {
    /**
        * 
     */
    private static final long serialVersionUID = 5286703103846683570L;
    private String failPage = "/info.jsp";//發(fā)生注入時盈魁,跳轉(zhuǎn)頁面

    public void doFilter(ServletRequest request,ServletResponse response,
            FilterChain filterchain)throws IOException, ServletException {
        //判斷是否有注入攻擊字符
        HttpServletRequest req = (HttpServletRequest) request;
        String inj = injectInput(req);
        if (!inj.equals("")) {
             request.getRequestDispatcher(failPage).forward(request, response);
             return;
        } else {
            // 傳遞控制到下一個過濾器
            filterchain.doFilter(request, response);
        }
    }

    /**
        * 判斷request中是否含有注入攻擊字符
        * @param request
        * @return
     */
    public String injectInput(ServletRequest request) {

        Enumeration e = request.getParameterNames();
        String attributeName;
        String attributeValues[];
        String inj = "";
        String injdb = "";
        while (e.hasMoreElements()) { 
            attributeName = (String)e.nextElement();
            //不對密碼信息進行過濾翔怎,一般密碼中可以包含特殊字符
            if(attributeName.equals("userPassword")||attributeName.equals("confirmPassword")||attributeName.equals("PASSWORD")
                    ||attributeName.equals("password")||attributeName.equals("PASSWORD2")||attributeName.equals("valiPassword")){
                continue;
            }

            attributeValues = request.getParameterValues(attributeName);
            for (int i = 0; i < attributeValues.length; i++) {

    if(attributeValues[i]==null||attributeValues[i].equals(""))
                    continue;
                inj = injectChar(attributeValues[i]);

                if (!inj.equals("")) 
                {
                    return inj;
                }        
            }
        }   
        return inj;
    }

    /**
        * 判斷字符串中是否含有注入攻擊字符
        * @param str
        * @return
     */
    public String injectChar(String str) {

       String inj_str = "\" ) \' * % < > &";
       String inj_stra[] = inj_str.split(" ");

       for (int i = 0 ; i < inj_stra.length ; i++ )
       {
           if (str.indexOf(inj_stra[i])>=0)
           {
               return inj_stra[i];
           }
       }
       return "";
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub 
           // System.out.println("----注入過濾器初始化----");  
    }  

}




 **3.如果跨站點的腳本編制還存在或者存在其他漏洞風(fēng)險就再搞個過濾器繼續(xù)加固驗證過濾**


**1.在xml文件繼續(xù)配置一個新的過濾器:**




<!--配置過濾器 跨站點腳本編制過濾 -->

    <filter>  
        <filter-name>XssFilter</filter-name>  
        <filter-class>com.filter.XssFilter</filter-class>  
    </filter> 
    <!--映射過濾器--> 

    <filter-mapping>
      <filter-name>XssFilter</filter-name>
        <!--"/*"表示攔截所有的請求 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping> 




2.過濾器代碼:




package com.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import com.RequestWrapper;
import javax.servlet.http.HttpServlet;

/*
* XSS過濾
 */
public class XssFilter extends HttpServlet implements Filter {

    /**
        * 
     */
    private static final long serialVersionUID = 6846384055249714181L;

    /**  
                * 需要排除的頁面  
        */    
        private String excludedPages;    
        private String[] excludedPageArray;   
        @SuppressWarnings("unused")  
        private FilterConfig filterConfig;  
        public void destroy() {  
            this.filterConfig = null;  
           // System.out.println("----過濾器銷毀----");
        }  
        public void doFilter(ServletRequest request, ServletResponse response,  
                FilterChain chain) throws IOException, ServletException {  
            boolean isExcludedPage = false;  
         // 強制類型轉(zhuǎn)換 HttpServletRequest
            HttpServletRequest request2 = (HttpServletRequest) request;  
            String ctx_path = request2.getContextPath();  
            String request_url = request2.getRequestURI();  
            String action = request_url.substring(ctx_path.length());  
            HttpServletResponse response2 = (HttpServletResponse)response;
            response2.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");

                if (isExcludedPage) {  
                chain.doFilter(request, response2);  
            } else {  // 構(gòu)造RequestWrapper對象處理XSS
                chain.doFilter(new RequestWrapper(request2), response2);  
            }  
        }  
        /** 
                * 自定義過濾規(guī)則 
         */  
        public void init(FilterConfig filterConfig) throws ServletException {  
            this.filterConfig = filterConfig;  
            excludedPages = filterConfig.getInitParameter("excludedPages");    
            if (StringUtils.isNotEmpty(excludedPages)) {  
                excludedPageArray = excludedPages.replaceAll("[\\s]", "").split(",");  
                //System.out.println("----過濾器初始化----");
            }  
        }  
}




 2.類RequestWrapper




package com.servlet;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import com.util.XssClean;

/*
* 增加XSS過濾
* 自定義的RequestWrapper中,對getParameter和getParameterValues進行重寫杨耙,從而達到對各個用戶輸入的form參數(shù)的值進行過濾
 */
public class RequestWrapper extends HttpServletRequestWrapper {
    HttpServletRequest orgRequest = null;  
    public RequestWrapper(HttpServletRequest request) {  
        super(request);  
        orgRequest = request;  
    }  
    /** 
        * 獲取最原始的request 
        *  
        * @return 
     */ 
    public HttpServletRequest getOrgRequest() {  
        return orgRequest;  
    }  
    /** 
        * 獲取最原始的request的靜態(tài)方法 
        *  
        * @return 
     */ 
    public static HttpServletRequest getOrgRequest(HttpServletRequest req) {  
        if (req instanceof RequestWrapper) {  
            return ((RequestWrapper) req).getOrgRequest();  
        }  
        return req;  
    } 

   /**
        * 覆蓋getParameterMap 方法赤套,對sql、html珊膜、script注入進行過濾
    */
   public Map<String,String> getParameterMap() {
       HashMap<String,String> paramMap = (HashMap<String,String>) super.getParameterMap();
       paramMap = (HashMap<String,String>) paramMap.clone();

       for (Iterator iterator = paramMap.entrySet().iterator(); iterator.hasNext(); ) {
           Map.Entry<String,String[]> entry = (Map.Entry<String,String[]>) iterator.next();
           String [] values = entry.getValue();
           for (int i = 0; i < values.length; i++) {
               if(values[i] instanceof String){
                   values[i] = XssClean.xssClean(values[i]);
               }
           }
           entry.setValue(values);
       }
       return paramMap;
   }
   //////////////////////////////////////////////////////////////////////////////////////////
   ///////////////////////////////////////////////////////////////////////////////////////////
   //濾掉form data中的惡意腳本
   public String[] getParameterValues(String paramString){  
     String[] arrayOfString1 = super.getParameterValues(paramString);  
     if (arrayOfString1 == null)  
       return null;  
     int i = arrayOfString1.length;  
     String[] arrayOfString2 = new String[i];  
     for (int j = 0; j < i; j++)  
       arrayOfString2[j] =XssClean.xssClean_New(arrayOfString1[j]);  
     return arrayOfString2;  
   }  

   public String getParameter(String paramString){  
     String str = super.getParameter(paramString);  
     if (str == null)  
       return null;  
     return XssClean.xssClean(str);  
   }  
//////////////////////////////////////////////////
   //在輸入流中檢測濾掉來自其他網(wǎng)站的URL中的惡意腳本
   public String getHeader(String paramString) {  
     String str = super.getHeader(paramString);  
     if (str == null)  
       return null;  
     return XssClean.xssClean(str);  
   } 
   ////////////////////////////////////////////////////////////////////////////////////////////
   ///////////////////////////////////////////////////////////////////////////////////////////////

   public String getQueryString() {
        String value = super.getQueryString();
        if (value != null) {
            value = XssClean.xssClean(value);
        }
        return value;
    }
 }




 3.類XssClean




package com.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;
import org.owasp.validator.html.AntiSamy;
import org.owasp.validator.html.CleanResults;
import org.owasp.validator.html.Policy;

import org.owasp.validator.html.PolicyException;
import org.owasp.validator.html.ScanException;
import org.springframework.web.util.HtmlUtils;
import org.apache.commons.io.IOUtils;

/*
* 增加 XSS過濾
* 加入了dependency之后容握,就可以在xssClean中加入antisamy對惡意腳本進行清理。其中policy.xml是白名單车柠,
* policy.xml中規(guī)定了各個html元素所必須滿足的條件剔氏。antisamy的精髓之處在于,使用policy文件來規(guī)定你的過濾條件竹祷,
* 若輸入字符串不滿足policy文件中的條件谈跛,則會過濾掉字符中的惡意腳本,返回過濾后的結(jié)果塑陵。
 */
public class XssClean {
    private static  Policy policy = null;  
    public static Policy getPolicy() throws PolicyException {  
        if (policy == null) {  
            InputStream policyFile = XssClean.class.getResourceAsStream("/resource/antisamy.xml");  //antisamy.xml此文件可能大裝載會報錯感憾,直接拋出異常即可不用理會也行。

           // 推薦一個jar包令花,用來轉(zhuǎn)換InputStream到String阻桅,
            // 引入apache的io包  import org.apache.commons.io.IOUtils;
            String result = null;
            try {
                result = IOUtils.toString(policyFile, "UTF-8");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            policy = Policy.getInstance(result); 

        }  
        return policy;  
    }  
     //將client端用戶輸入的request凉倚,在server端進行了攔截,并且進行了過濾
    public static String xssClean_New(String value) { 
        if (StringUtils.isNotEmpty(value)) {  
            AntiSamy antiSamy = new AntiSamy();  
            try {  
                //如果 不用此方法 可以 使用 下面注釋的代碼實現(xiàn)
                final CleanResults cr = antiSamy.scan(StringUtil.UrlDecode(value, "UTF-8"), getPolicy());  
                // final CleanResults cr = antiSamy.scan(value, Policy.getInstance("antisamy.xml"), AntiSamy.SAX);

                //安全的HTML輸出  
                value = cr.getCleanHTML(); 
                value = HtmlUtils.htmlEscape(value);

                //return cr.getCleanHTML();
            } catch (ScanException e) {  
                e.printStackTrace();  
            } catch (PolicyException e) {  
                System.out.println("加載XSS規(guī)則文件異常: " + e.getMessage());  
            }  
        }  
        return value;  
    } 


    public static String xssClean_4(String value) {//界面會報錯
        value = StringUtil.UrlDecode(value, "UTF-8");
        value = HtmlUtils.htmlEscape(value);
        value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
        value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
        value = value.replaceAll("'", "& #39;");
        value = value.replaceAll("eval\\((.*)\\)", "");
        value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
        value = value.replaceAll("script", "");
        return value;
    } 


    /** 
        * 將容易引起xss漏洞的半角字符直接替換成全角字符 
        *  清除惡意的XSS腳本
        * @param s 
        * @return 
     */  
    public static String xssClean(String value) {  
        if (value == null || value.isEmpty()) {  
            return value;  
        }  
        value = StringUtil.UrlDecode(value, "UTF-8");
        value = HtmlUtils.htmlEscape(value);

        value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
        value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
        value = value.replaceAll("'", "& #39;");
        value = value.replaceAll("eval\\((.*)\\)", "");
        value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
        value = value.replaceAll("script", "");

        StringBuilder sb = new StringBuilder(value.length() + 16);  
        for (int i = 0; i < value.length(); i++) {  
            char c = value.charAt(i);  
            switch (c) {  
            case '>':  
                sb.append(">");// 轉(zhuǎn)義大于號   
                break;  
            case '<':  
                sb.append("<");// 轉(zhuǎn)義小于號   
                break;  
            case '\'':  
                sb.append("'");// 轉(zhuǎn)義單引號   
                break;  
            case '\"':  
                sb.append(""");// 轉(zhuǎn)義雙引號   
                break;  
            case '&':  
                sb.append("&");// 轉(zhuǎn)義&   
                break;  
            default:  
                sb.append(c);  
                break;  
            }  
        }  
        return sb.toString();  
    } 


    public static  String xssClean_error(String value) {
        if (value != null) {
            value = value.replaceAll("", "");
            // Avoid anything between script tags
            Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid anything in a src="http://www.yihaomen.com/article/java/..." type of e-xpression
            scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
            scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
            // Remove any lonesome </script> tag
            scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            // Remove any lonesome <script ...> tag
            scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid eval(...) e-xpressions
            scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid e-xpression(...) e-xpressions
            scriptPattern = Pattern.compile("e-xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid javascript:... e-xpressions
            scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid vbscript:... e-xpressions
            scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid onload= e-xpressions
            scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");

            value = HtmlUtils.htmlEscape(value);
        }
        return value;
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫂沉,一起剝皮案震驚了整個濱河市稽寒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趟章,老刑警劉巖杏糙,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尤揣,居然都是意外死亡搔啊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門北戏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漫蛔,你說我怎么就攤上這事嗜愈。” “怎么了莽龟?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵蠕嫁,是天一觀的道長。 經(jīng)常有香客問我毯盈,道長剃毒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任搂赋,我火速辦了婚禮赘阀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脑奠。我一直安慰自己基公,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布宋欺。 她就那樣靜靜地躺著轰豆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪齿诞。 梳的紋絲不亂的頭發(fā)上酸休,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音祷杈,去河邊找鬼斑司。 笑死,一個胖子當(dāng)著我的面吹牛吠式,可吹牛的內(nèi)容都是我干的陡厘。 我是一名探鬼主播抽米,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼糙置!你這毒婦竟也來了云茸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤谤饭,失蹤者是張志新(化名)和其女友劉穎标捺,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揉抵,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡亡容,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冤今。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闺兢。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖戏罢,靈堂內(nèi)的尸體忽然破棺而出屋谭,到底是詐尸還是另有隱情,我是刑警寧澤龟糕,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布桐磁,位于F島的核電站,受9級特大地震影響讲岁,放射性物質(zhì)發(fā)生泄漏我擂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一缓艳、第九天 我趴在偏房一處隱蔽的房頂上張望校摩。 院中可真熱鬧,春花似錦郎任、人聲如沸秧耗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽分井。三九已至,卻和暖如春霉猛,著一層夾襖步出監(jiān)牢的瞬間尺锚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工惜浅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瘫辩,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像伐厌,于是被迫代替她去往敵國和親承绸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容