1、Web编程常见漏洞与检测,By:Neeao 2008.9.21,Web漏洞检测,白盒检测 对检测者的要求:能读懂用此语言写的程序明白漏洞成因漏洞挖掘经验 常用的web脚本语言:Asp/Php/Jsp/,常见的web漏洞,sql注入 文件上传 cookie欺骗 XSS攻击 文件包含 其他,Sql注入及其危害,所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过递交参数构造巧妙的SQL语句,从而成功获取想要的数据。 分为字符型注入和数字型的注入,由于编程语言不同,所存在的注入类型也不同。 危害:-非法查询其他数据库资
2、源,如管理员帐号。-执行系统命令-获取服务器root权限,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
3、语句到数据库后: sqlStr = “select * from n_user where username=test and password=123 or 1=1“ Or 1=1始终成立。,Asp表现,存在数字型和字符型注入。 (A) 数字型 字段=51Select * from 表名 where 字段=51 构造参数:ID=49 And 查询条件 生成语句:Select * from 表名 where 字段=49 And 查询条件 (B)字符型的另一种形式搜索语句:Select * from 表名 where 字段like %关键字% 构造参数:keyword= and 查询条件 and
4、 %25=生成语句:Select * from 表名 where字段like % and 查询条件 and %=%,Asp注入的预防,对于用户端输入的任意字符,包括GET提交,POST提交,Cookie提交,SERVER提交的都需要做严格过滤。 对于数字型参数判断是否为数字:可用函数isNumeric来判断,返回值为true和false。 对于字符型参数过滤单引号,使其无法闭合当前sql语句的单引号。 例外:base64编码 Sql通用防注入,Php中的表现,Php的魔术引号(magic_quotes_gpc ) 。 php.ini-dist 默认是开启此功能。如果安装php时使用此文件,将不
5、会产生字符型注入,主要是数字型注入。 数字型注入:select * from guess where id=“.$id.”select * from guess where id=$id,GPC不起作用的情况,数组$userid=$_POSTuserid;for($i=0;$icount($ userid);$i+)$query=“select * from user where i_hid=“.$ userid$i.“; 编码函数引起base64_decode,base64编码后的单引号:Jw= mysql处理GBK编码字符%bf%27导致单引号被绕过的问题。 其他数据库,如ms sql。对
6、于转义符反斜杠作为字符处理的。select * from test where title =aaa or 1=1,Php注入的预防(一),确认GPC开启,若没开启则用addslashes 函数过滤之,如下代码。if (!get_magic_quotes_gpc() $lastname = addslashes($_POSTlastname); else $lastname = $_POSTlastname; 对于数字型参数可使用intval 或floatval 强制转换为数字型。 注意mysql的版本以及默认字符集,Mysql4.1 字符集连接字符串:mysql_query(“SET cha
7、racter_set_connection=$dbcharset,character_set_results=$dbcharset, character_set_client=binary;“);,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
8、(); $stmt-bind_result($district); $stmt-fetch(); printf(“%s is in district %sn“, $city, $district); $stmt-close(); ,Jsp 表现,由于java语言是强类型语言,所有变量定义前必须声明其类型,因而仅存在字符型的注入。 字符型注入实例:String sql = “select * from tb_name where name= “+varname+“ and passwd=“+varpasswd+“;stmt = conn.prepareStatement(sql);构造参数var
9、passwd值为: or 1 = 1 Sql语句经过解析后将是:select * from tb_name = 随意 and passwd = or 1 = 1;,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);,A表现,开发语
10、言常用的有:和C#,都属于强类型语言,因而只存在字符型注入。 注入原理,与asp的字符型注入一样。,A注入预防,使用A的参数化查询。strSQL = “SELECT * FROM Orders WHERE CustomerID = CustomerID“;SqlCommand cmd = new SqlCommand(strSQL, cn);/创建一个sqlcommand对象。/创建新参数,参数绑定cmd.Parameters.AddWithValue(“CustomerID“, “ALFKI“);,sql注入的检测简单流程,Sql语句一样,查询方法也一样。,文件上传漏洞,利用当前系统已有的上
11、传功能,比如文件上传,图像上传等的漏洞来上传任意文件或者webshell。 危害:直接上传webshell到服务器,甚至获取服务器root权限。 各种语言表现大同小异。,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
12、.CreateTextFile(FSO.BuildPath(Path, tFile),Asp上传漏洞预防/检测,检查文件名是否包含0字符。 采用白名单方式允许上传文件类型。 检测关键字:Scripting.FileSystemObject/ADODB.Stream,Php上传漏洞表现,$imageinfo = getimagesize($_FILESuserfiletmp_name); if($imageinfomime != image/gif ,Php上传漏洞预防/检测,检查上传文件名中是否存在.php字符。 采用白名单,仅允许安全的类型,如gif/jpg/rar等,禁止用户自定义文件后缀
13、。 检测关键字:move_uploaded_file/is_uploaded_file/copy,Jsp文件上传漏洞/预防/检测,后缀检查不严引起的上传任意文件,主要为jsp和war后缀文件。 采用白名单严格限制上传类型。 检测方法:File/SmartUpload(常用的一个jsp开源上传组件)至/WEB-INF/lib/目录下查看相关upload字样的类库,作为关键字搜索。,A 文件上传漏洞/预防/检测,A自身提供有上传组件,但默认上传任意后缀文件。 IIS默认解析的后缀名都是不安全的,采用白名单方式上传文件。 检查关键字:PostedFile.FileName/FileUpload,Co
14、okie 欺骗攻击,Cookie:Web服务器存放在客户端计算机的一些信息,主要用来客户端识别或身份识别等。Session,保存在服务器端的。 Cookie欺骗攻击:攻击者通过修改存放在客户端的cookie来达到欺骗服务器认证目的。 修改工具:IECookiesView,Cookie攻击原理,If(“登录验证过程”)setcookie(“isadmin”,1,time()+3600*24*30); /登录成功,写入cookie,一个月后失效,用于下次登录。 $admin= $_COOKIE“isadmin“; if($admin)echo “已经登录”;else echo “请重新登陆”; /
15、没对cookie有效性进行验证,导致cookie欺骗产生。,Cookie欺骗预防,禁用cookie,采用session。一般适合web系统安全性要求比较高的情况下后台管理等。 增加多参数验证cookie有效性。如验证访问者ip是否与上次IP一样等。,Cookie欺骗检测,关键字检测 Asp: Response.Cookies/Request.Cookies Php: Setcookie/$_COOKIE/$HTTP_COOKIE_VARS Jsp:response.addCookie /request.getCookies A:response.Cookies/request.Cookies,
16、XSS(跨站脚本攻击),跨站脚本攻击(通常简写为XSS)是指攻者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。 危害:盗取用户cookieXss蠕虫挂马,结合xss蠕虫,危害巨大。,Xss防范,对用户输入数据编码:Asp:server.htmlencode函数Php:htmlspecialchars函数:HttpContext.Current.Server.HtmlEncodejsp:默认没有提供过滤方法,需要自写方法。 过滤危险的html关键字符:比如:script/if
17、rame等。,XSS检测,搜索关键字。 Asp:request/ Php:$_GET/$_POST/$_COOKIE/$_SERVER Jsp:request.getParameter/ request.getCookies A:Request.QueryString/Form/Cookies/SeverVaiables/,Php 文件包含漏洞,Php:include/require / include_once /require_once函数使用时参数没有限制导致可以包含远程文件或者本地文件。 Php4存在远程&本地,php5仅存在本地包含。 检测: include/require/include_once /require_once 其他语言表现。,其他漏洞检测,信息泄露 权限验证不严 仅仅罗列了一些常见的漏洞情况,实际上检测难度将比这个代码复杂的多了,这就要求我们对程序有足够的了解。,完 谢谢!,