• 1. Web编程常见漏洞与检测By:General 联系email tvlf@yahoo.cn
  • 2. Web漏洞检测白盒检测 对检测者的要求: ——能读懂用此语言写的程序 ——明白漏洞成因 ——漏洞挖掘经验 常用的web脚本语言:Asp/Php/Jsp/asp.net
  • 3. 常见的web漏洞sql注入 文件上传 cookie欺骗 XSS攻击 文件包含 其他
  • 4. Sql注入及其危害所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过递交参数构造巧妙的SQL语句,从而成功获取想要的数据。 分为字符型注入和数字型的注入,由于编程语言不同,所存在的注入类型也不同。 危害: --非法查询其他数据库资源,如管理员帐号。 --执行系统命令 --获取服务器root权限
  • 5. Sql注入原理Test.asp文件代码片段: sqlStr = “select * from n_user where username=‘”&username&”’ and password=‘“&password&”’ rs = conn.execute(sqlStr) 正常的查询:test.asp?username=test&password=123 sqlStr = “select * from n_user where username=‘test’ and password=‘123’“ 使password=123 ‘ or ‘1’=‘1: Sql语句到数据库后: sqlStr = “select * from n_user where username=‘test’ and password=‘123’ or ‘1’=‘1’“ Or ‘1’=‘1’始终成立。
  • 6. Asp表现存在数字型和字符型注入。 (A) 数字型 字段=51 Select * from 表名 where 字段=51 构造参数:ID=49 And [查询条件] 生成语句:Select * from 表名 where 字段=49 And [查询条件] (B)字符型的另一种形式 搜索语句:Select * from 表名 where 字段like ’%关键字%’ 构造参数:keyword=’ and [查询条件] and ‘%25’=’ 生成语句:Select * from 表名 where字段like ’%’ and [查询条件] and ‘%’=’%’
  • 7. Asp注入的预防对于用户端输入的任意字符,包括GET提交,POST提交,Cookie提交,SERVER提交的都需要做严格过滤。 对于数字型参数判断是否为数字:可用函数isNumeric来判断,返回值为true和false。 对于字符型参数过滤单引号,使其无法闭合当前sql语句的单引号。 例外:base64编码 Sql通用防注入
  • 8. Php中的表现Php的魔术引号(magic_quotes_gpc ) 。 php.ini-dist 默认是开启此功能。如果安装php时使用此文件,将不会产生字符型注入,主要是数字型注入。 数字型注入: select * from guess where id=“.$id.” select * from guess where id=$id
  • 9. GPC不起作用的情况数组 $userid=$_POST[userid']; for($i=0;$i4.1 字符集连接字符串: mysql_query("SET character_set_connection=$dbcharset, character_set_results=$dbcharset, character_set_client=binary;");
  • 11. Php注入的预防(二)Php5以上版本Mysqli扩展预防,参数化查询 $city = "Amersfoort"; /* create a prepared statement */ $stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")   $stmt->bind_param("s", $city);     $stmt->execute();     $stmt->bind_result($district);     $stmt->fetch();     printf("%s is in district %s\n", $city, $district);     $stmt->close(); }
  • 12. Jsp 表现由于java语言是强类型语言,所有变量定义前必须声明其类型,因而仅存在字符型的注入。 字符型注入实例: String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'"; stmt = conn.prepareStatement(sql); 构造参数varpasswd值为:' or '1' = '1 Sql语句经过解析后将是: select * from tb_name = '随意' and passwd = '' or '1' = '1';
  • 13. Jsp预防采用jdbc的prepareStatement查询数据库,并且sql语句中不出现参数,如: sqlStr = “select id from info where city=? and open=? order by id desc”; stmt = conn.prepareStatement(sqlStr); stmt.setString(1,city); stmt.setString(2,var1);
  • 14. Asp.net表现开发语言常用的有:vb.net和C#,都属于强类型语言,因而只存在字符型注入。 注入原理,与asp的字符型注入一样。
  • 15. Asp.net注入预防使用Ado.net的参数化查询。 strSQL = "SELECT * FROM Orders WHERE CustomerID = @CustomerID"; SqlCommand cmd = new SqlCommand(strSQL, cn);//创建一个sqlcommand对象。 //创建新参数,参数绑定 cmd.Parameters.AddWithValue("@CustomerID", "ALFKI");
  • 16. sql注入的检测简单流程Sql语句一样,查询方法也一样。
  • 17. 文件上传漏洞利用当前系统已有的上传功能,比如文件上传,图像上传等的漏洞来上传任意文件或者webshell。 危害:直接上传webshell到服务器,甚至获取服务器root权限。 各种语言表现大同小异。
  • 18. Asp上传漏洞表现经典的”\0”上传任意后缀文件 。 假设:filename="c:\nc.exe .bmp" ‘ Check the file extension if right(tFile,4) <> “.bmp” then exit sub tFile=tFile &".bmp" Set FSO = Server.CreateObject("Scripting.FileSystemObject") Set FSOFile= FSO.CreateTextFile(FSO.BuildPath(Path, tFile))NC.EXE(Nul).BMP4E432E455845002E424D50
  • 19. Asp上传漏洞预防/检测检查文件名是否包含‘\0’字符。 采用白名单方式允许上传文件类型。 检测关键字:Scripting.FileSystemObject/ADODB.Stream
  • 20. Php上传漏洞表现$imageinfo = getimagesize($_FILES['userfile']['tmp_name']); if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') { if($_FILES['userfile']['type'] != "image/gif") { echo “仅允许上传GIF和JPEG图片\n"; exit; } $uploaddir = 'uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo “文件上传成功.\n"; } else { echo “上传失败.\n"; }
  • 21. Php上传漏洞预防/检测检查上传文件名中是否存在.php字符。 采用白名单,仅允许安全的类型,如gif/jpg/rar等,禁止用户自定义文件后缀。 检测关键字:move_uploaded_file/is_uploaded_file/copy
  • 22. Jsp文件上传漏洞/预防/检测后缀检查不严引起的上传任意文件,主要为jsp和war后缀文件。 采用白名单严格限制上传类型。 检测方法: ——File/SmartUpload(常用的一个jsp开源上传组件) ——至/WEB-INF/lib/目录下查看相关upload字样的类库,作为关键字搜索。
  • 23. Asp.net 文件上传漏洞/预防/检测Asp.net自身提供有上传组件,但默认上传任意后缀文件。 IIS默认解析的后缀名都是不安全的,采用白名单方式上传文件。 检查关键字: PostedFile.FileName/FileUpload
  • 24. Cookie 欺骗攻击Cookie:Web服务器存放在客户端计算机的一些信息,主要用来客户端识别或身份识别等。Session,保存在服务器端的。 Cookie欺骗攻击:攻击者通过修改存放在客户端的cookie来达到欺骗服务器认证目的。 修改工具:IECookiesView
  • 25. Cookie攻击原理If(“登录验证过程”){ setcookie("isadmin”,1,time()+3600*24*30); }//登录成功,写入cookie,一个月后失效,用于下次登录。 …… $admin= $_COOKIE[“isadmin"]; if($admin){ echo “已经登录”; }else{ echo “请重新登陆”;} //没对cookie有效性进行验证,导致cookie欺骗产生。
  • 26. Cookie欺骗预防禁用cookie,采用session。一般适合web系统安全性要求比较高的情况下 ——后台管理等。 增加多参数验证cookie有效性。 ——如验证访问者ip是否与上次IP一样等。
  • 27. Cookie欺骗检测关键字检测 Asp: Response.Cookies/Request.Cookies Php: Setcookie/$_COOKIE/$HTTP_COOKIE_VARS Jsp: response.addCookie /request.getCookies Asp.net:  response.Cookies/request.Cookies
  • 28. XSS(跨站脚本攻击)跨站脚本攻击(通常简写为XSS)是指攻者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。 危害: ——盗取用户cookie ——Xss蠕虫 ——挂马,结合xss蠕虫,危害巨大。
  • 29. Xss防范对用户输入数据编码: Asp:server.htmlencode函数 Php:htmlspecialchars函数 asp.net:HttpContext.Current.Server.HtmlEncode jsp:默认没有提供过滤方法,需要自写方法。 过滤危险的html关键字符: 比如:script/iframe等。
  • 30. XSS检测搜索关键字。 Asp:request/ Php:$_GET/$_POST/$_COOKIE/$_SERVER Jsp:request.getParameter/ request.getCookies Asp.net:Request.QueryString/Form/Cookies/SeverVaiables/
  • 31. Php 文件包含漏洞Php:include/require / include_once /require_once函数使用时参数没有限制导致可以包含远程文件或者本地文件。 Php4存在远程&本地,php5仅存在本地包含。 检测: include/require/include_once /require_once 其他语言表现。
  • 32. 其他漏洞检测信息泄露 权限验证不严 仅仅罗列了一些常见的漏洞情况,实际上检测难度将比这个代码复杂的多了,这就要求我们对程序有足够的了解。
  • 33. 完 谢谢!