1 Web漏洞检测 白盒检测 对检测者的要求: ——能读懂用此语言写的程序 ——明白漏洞成因 ——漏洞挖掘经验 常用的web脚本语言:Asp/Php/Jsp/asp.net ************************************************************************************************** 2 常见的web漏洞 sql注入 文件上传 cookie欺骗 XSS攻击 文件包含 其他 3 Sql注入及其危害 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过递交参数构造巧妙的SQL语句,从而成功获取想要的数据。 分为字符型注入和数字型的注入,由于编程语言不同,所存在的注入类型也不同。 危害: --非法查询其他数据库资源,如管理员帐号。 --执行系统命令 --获取服务器root权限 4 由于使用编程语言和数据库的不同,漏洞的利用以及所造成的危害也不同。 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’始终成立。 5 可以通过修改city来构造不同的语句来达到我们查询数据库的效果,现在对于sql注入已经全自动化了,最初出现的工具有原54NB论坛小竹写的NBSI,是最经典的工具了,后来出来了无数的全自动注入工具,在这里就不再赘述了。 Sql二次注入 Update,Insert插入注入语句,通过内部传参进行注入。 Insert users (username)values(’1 and 1=1’) Select * from users where username =values 6 二次注射原理图 SQL注射 数据库 其他函数[如Include] 构造变量 UPDATA INSERT 提取变量 SELECT 7 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 ‘%’=’%’ 8 Asp注入的预防 对于用户端输入的任意字符,包括GET提交,POST提交,Cookie提交,SERVER提交的都需要做严格过滤。 对于数字型参数判断是否为数字:可用函数isNumeric来判断,返回值为true和false。 对于字符型参数过滤单引号,将其替换为l两个单引号,使其无法闭合当前sql语句的单引号。 例外:base64编码 Sql通用防注入,全局过滤GET、POST 9 Asp防注入过滤demo Function SafeCheck(strString) If isNumeric(strString) then strString=strString Else strString=replace(strString,"'","''") End if SafeCheck=strString End function 10 Php中的表现 Php的魔术引号(magic_quotes_gpc ) 。 php.ini-dist 默认是开启此功能。如果安装php时使用此文件,将不会产生字符型注入,主要是数字型注入。 数字型注入: select * from guess where id=“.$id.” select * from guess where id=$id 11 魔术引号(Magic Quote)是一个自动将进入 PHP 脚本的数据进行转义的过程。 ,当打开时,所有的 ‘(单引号),“(双引号),\(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义。 GPC不起作用的情况 二次编码 编码解码引起 Urlencode()/Urldecode Rawurlencode()/Rawurldecode Base64_encode()/Base64_decode mysql处理GBK编码字符%bf%27导致单引号被绕过的问题。 其他数据库,如ms sql。对于转义符反斜杠作为字符处理的。 select * from test where title ='aaa\' or '1'='1‘ 12 Php注入的预防(一) 确认GPC开启,若没开启则用addslashes 函数过滤之 function myaddslashes($strString){ if (is_numeric($strString)){ $strString = $strString; }else{ $strString = addslashes($strString); } return $strString; } 注意mysql的版本以及默认字符集,Mysql>4.1 字符集连接字符串: mysql_query("SET character_set_connection=$dbcharset, character_set_results=$dbcharset, character_set_client=binary;"); 13 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(); } PHP加入的PDO(PHP Data Object)也有预处理。 14 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'; 15 由于j2ee项目有很多持久层框架,在这里仅仅用jdbc来讲解。 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); 16 Jdbc提供两个方法来执行sql语句:Statement和这个prepareStatement,两者的区别在于: 我们每一个sql语句发送到数据库处理的时候,数据库先进行解析(硬解析)。这个解析是需要消耗cpu时间的。然后把解析的结果保存在数据库的内存中(并 且经过hash算法),以后如果有一样的sql语句,数据库马上就可以找到该语句,根本不需要硬解析过程,而是进行软解析,只是替换?为一些值, Asp.net表现 开发语言常用的有:vb.net和C#,都属于强类型语言,因而只存在字符型注入。 注入原理,与asp的字符型注入一样。
17 Asp.net注入预防 使用Ado.net的参数化查询。 strSQL = "SELECT * FROM Orders WHERE CustomerID = @CustomerID"; SqlCommand cmd = new SqlCommand(strSQL, cn);//创建一个sqlcommand对象。 //创建新参数,参数绑定 cmd.Parameters.AddWithValue("@CustomerID", "ALFKI"); 18 与jsp中的jdbc的preparestatement方法原理是一样的,在这里就不再赘述了。 sql注入的检测简单流程 Java反编译: Jad 1.5.8g Asp.net反编译: .NET Reflector? Latest version: 5.1.3
Php破解工具: deZender 0.9.5.1 19 文件上传漏洞 利用当前系统已有的上传功能,比如文件上传,图像上传等的漏洞来上传任意文件或者webshell。 危害:直接上传webshell到服务器,甚至获取服务器root权限。 各种语言表现大同小异。 20 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)) 21 04年,dvbbs出现的上传漏洞。 04年动力文章系统3.6最先暴出来,之后的oblog。 Asp上传漏洞表现(二) const UpFileType="rar|zip|exe|mpg|rm|wav|mid" dim EnableUpload FoundErr=false '默认FoundErr变量为假EnableUpload=false & nbsp; '默认EnableUpload变量为假,即不能上... for each formName in upload.file set ofile=upload.file(formName) ‘生成一个文件对象 arrUpFileType=split(UpFileType,“|”) ’允许上传后缀 名 for i=0 to ubound(arrUpFileType) if fileEXT=trim(arrUpFileType(i)) then EnableUpload=true ’变量改变了! exit for end if next if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then EnableUpload=false end if if EnableUpload=false then msg=“这种文件类型不允许上传!\n\n只允许上传这几种文件类型:” & UpFileType FoundErr=true ‘hoho,FoundErr变量改变了! end if 22 Asp上传漏洞表现(二) ... if FoundErr<>true then randomize ranNum =int(900*rnd)+100 '生成一个随机 数 filename=SavePath& year(now)&month(now)&day(now)&hour(now)&minute(now)&second (now)&ranNum&"."&fileExt '没有改变上传文件的后缀,爽阿 ... ofile.SaveToFile Server.mappath(FileName) '保存文件 23 Asp上传漏洞预防/检测 检查文件名是否包含‘\0’字符。 采用白名单方式允许上传文件类型。 检测关键字:Scripting.FileSystemObject/ADODB.Stream 常见asp上传组件 FSO等读取文件或目录参数限制 24 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"; } 25 修改数据包的Content-Type: image/gif Php上传漏洞预防/检测 检查上传文件名中是否存在.php字符。 Apache文件名解析缺陷漏洞, 解析.php.cxj 采用白名单,仅允许安全的类型,如gif/jpg/等,禁止用户自定义文件后缀。 Windows文件系统对.的忽略:shell.php.=shell.php 检测关键字:move_uploaded_file/is_uploaded_file/copy 26 Jsp文件上传漏洞/预防/检测 后缀检查不严引起的上传任意文件,主要为jsp和war后缀文件。 采用白名单严格限制上传类型。 检测方法: ——File/SmartUpload(常用的一个jsp开源上传组件) ——至/WEB-INF/lib/目录下查看相关upload字样的类库,作为关键字搜索。 27 Asp.net 文件上传漏洞/预防/检测 Asp.net自身提供有上传组件,但默认上传任意后缀文件。 IIS默认解析的后缀名都是不安全的,采用白名单方式上传文件。 检查关键字: PostedFile.FileName/FileUpload 28 Cookie 欺骗攻击 Cookie:Web服务器存放在客户端计算机的一些信息,主要用来客户端识别或身份识别等。Session,保存在服务器端的。 Cookie欺骗攻击:攻击者通过修改存放在客户端的cookie来达到欺骗服务器认证目的。 修改工具:IECookiesView 29 Cookie攻击原理 If(“登录验证过程”){ setcookie("isadmin”,1,time()+3600*24*30); }//登录成功,写入cookie,一个月后失效,用于下次登录。 …… $admin= $_COOKIE[“isadmin"]; if($admin){ echo “已经登录”; }else{ echo “请重新登陆”;} //没对cookie有效性进行验证,导致cookie欺骗产生。 30 Cookie欺骗预防 禁用cookie,采用session。一般适合web系统安全性要求比较高的情况下 ——后台管理等。 增加多参数验证cookie有效性。 ——如验证访问者ip是否与上次IP一样等。 31 Cookie欺骗检测 关键字检测 Asp: Response.Cookies/Request.Cookies Php: Setcookie/$_COOKIE/$HTTP_COOKIE_VARS Jsp: response.addCookie /request.getCookies Asp.net: response.Cookies/request.Cookies 32 通过搜索关键字,根据关键字所在位置来判断是否存在cookie欺骗的可能性。 XSS(跨站脚本攻击) 跨站脚本攻击(通常简写为XSS)是指攻者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。 危害: ——盗取用户cookie ——Xss蠕虫 ——挂马,结合xss蠕虫,危害巨大。 33 百度空间蠕虫,校内网蠕虫。 Xss防范 对用户输入数据编码: Asp:server.htmlencode函数 Php:htmlspecialchars函数 asp.net:HttpContext.Current.Server.HtmlEncode jsp:默认没有提供过滤方法,需要自写方法。 过滤危险的html关键字符: 比如:script/iframe等。 34 获取当前用户cookie的,结合上面介绍的cookie欺骗攻击,可以盗取用户权限。 XSS检测 搜索关键字。 Asp:request/ Php:$_GET/$_POST/$_COOKIE/$_SERVER Jsp:request.getParameter/ request.getCookies Asp.net:Request.QueryString/Form/Cookies/SeverVaiables/ 35 Php 文件包含漏洞 Php:include/require / include_once /require_once函数使用时参数没有限制导致可以包含远程文件或者本地文件。 Php4存在远程&本地,php5仅存在本地包含。 检测: include/require/include_once /require_once 其他语言表现。 36 Php函数引发的漏洞 Preg_repace()当第一个参数的正则表达式有e符号的时候,第二个参数的字符串当做PHP代码执行。 <? //preg_replace.php echo preg_replace("/test/e",$h,"jutst test"); preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", "\\1", $h); ?> Preg_replace.php?h=phpinfo() ,phpinfo()将本执行。
37 Asp.net 爆绝对路径
38 其他漏洞检测 信息泄露 权限验证不严 仅仅罗列了一些常见的漏洞情况,实际上检测难度将比这个代码复杂的多了,这就要求我们对程序有足够的了解。