The first day,fighting.
Web渗透测试:
渗透测试是对系统安全性的测试,通过模拟恶意黑客的攻击方法,来评估系统安全的一种评估方法。
1、SQL注入攻击
首先找到带有参数传递的URL页面,如搜索页面、登录页面、提交评论页面等。
对于未明显标识在URL中传递参数的,可以通过查看HTML源代码中的FORM标签来辨别是否还有参数传递,在<FORM>和</FORM>的标签中间的每一个参数传递都有可能被利用。
当找不到有输入行为的页面时候,可以尝试找一些带有某些参数的特殊的URL,如HTTP://DOMAIN/INDEX.ASP?ID=10
在URL参数或表单中加入某些特殊的SQL语句或SQL片段,如在登录页面的URL中输入HTTP://DOMAIN/INDEX.ASP?USERNAME='HI' OR 1=1
根据实际情况,SQL注入请求可以使用以下语句:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
OR是一个逻辑运算符,在判断多个条件的时候,只要一个成立,则等式就成立,后面的AND就不再执行判断了,也就是说绕过了密码验证,只用用户名就可以登录。
--是忽略或注释,通过连接符注释掉后面的密码验证(对access数据库无效)。
预防SQL注入:转义敏感字符及字符串;屏蔽出错信息;在服务端正式处理之前对提交数据的合法性进行检查(合法性检查主要包括三项:数据类型,数据长度,敏感字符的校验)。最根本的解决手段是在确认客户端的输入合法之前,服务端拒绝进行关键性的处理操作。
SQL注入步骤:
首先,判断环境,寻找注入点,判断数据库类型。
其次,根据注入参数类型,在南海中重构SQL语句的原貌,按参数类型主要分为三种:
(A)ID=49
这类注入的参数是数字型,SQL语句原貌大致如下:
select * from 表名 where 字段=49
注入的参数为ID=49 and [查询条件],即生成语句:
select * from 表名 where 字段=49 And [查询条件]
(B)class=连续剧
这类注入的参数是字符型,SQL语句原貌大致如下:
select * from 表名 where 字段=‘连续剧’
注入的参数为class=连续剧’ and [查询条件] and ' ' =' ,即生成语句:
select * from 表名 where 字段=‘连续剧’ and [查询条件] and ' '=' '
搜索时没过滤参数的,如keyword=关键字,SQL语句原貌大致如下:
Select * from 表名 where 字段like ’%关键字%’
注入的参数为keyword=’ and [查询条件] and ‘%25’=’, 即是生成语句:
Select * from 表名 where字段like ’%’ and [查询条件] and ‘%’=’%’
接着,将查询条件替换成SQL语句,猜解表名,例如:
ID=49 And (Select Count(*) from Admin)>=0
如果页面就与ID=49的相同,说明附加条件成立,即表Admin存在,反之,即不存在(请牢记这种方法)。如此循环,直至猜到表名为止。
表名猜出来后,将Count(*)替换成Count(字段名),用同样的原理猜解字段名。
最后,在表名和列名猜解成功后,再使用SQL语句,得出字段的值。
SQL注入常用函数:
Access: asc(字符),SQL Server: unicode(字符)
作用:返回某字符的ASCII码
Access: chr(数字),SQL Server: nchar(数字)
作用:根据ASCII码返回字符
Access: mid(字符串,N,L),
SQL Server: substring(字符串,N,L)
作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串
Access: abc(数字),SQL Server: abc(数字)
作用:返回数字的绝对值(在猜解汉字的时候会用到)
Access: A between B And C ,SQL Server: A between B And C
作用:判断A是否界于B和C之间
中文处理方法:
access:中文的ASCII码可能会出现负数,取出该负数后用abs()取绝对值,汉字字符不变。
SQL Server:中文的ASCII为正数,但由于是UNICODE的双位编码,不能用函数ascii()取得ASCII码。必须用函数Unicode()返回Unicode值,再用nchar函数取得对应的中文字符。
注意,引用数字时不需要按添加开始和结尾的单引号定界符。数据库处理数值类型的值时,数值不带引号。
2、Cross-site scripting(XSS):跨站点脚本攻击
首先找到带有参数传递的URL,如登录页面,搜索页面,提交评论,发表留言页面等。
其次,在页面参数中输入如下语句:<script>alert(document.cookie)</script>
当用户浏览时便会弹出一个警告框,内容显示的是浏览者当前的cookie串,这就说明该网站存在XSS漏洞。
预防XSS漏洞:对JavaScript,VB script,HTML,ActiveX,Flash等语句或脚本进行转义;在服务端正式处理之前对提交数据的合法性进行检查(合法性检查主要包括三项:数据类型,数据长度,敏感字符的校验)。
3、CSRF:跨站点伪造请求
与XSS不同,且攻击方式几乎相左,XSS是利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。
XSS和CSRF目的在于窃取用户的信息,如session和cookies.
4、Email Header Injection:邮件标头注入
如果表单用于发送email,表单中可能包括subject输入项(邮件标题),我们要验证subje中应能escape掉\n标识。
因为“\n”是换行,如果在subje中输入“hello\ncc:spamvictim@example.com”,可能会形成:
subject:hello
cc:spamvictim@example.com
如果允许用户使用这样的subject,那他可能会利用这个缺陷通过我们的平台给其他用户发送垃圾邮件。
5、Directory Traversal:目录遍历
程序中没有过滤用户输入的“../”和“./”之类的目录跳转符,导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件。
测试方法:在URL中输入一定数量的“../”和“./”,验证系统是否escape掉了这些目录跳转符。
预防目录遍历:限制Web应用在服务器上的运行,进行严格的输入验证,控制用户输入非法路径。
6、exposed err messages:错误信息
首先找到一些错误页面,比如404或500页面。
验证在调试未开通过的情况下,是否给出了有好的错误提示信息,比如“你访问的页面不存在”等,而并非暴露一些程序代码。
预防错误信息:测试人员在进行需求检查时,应该对出错信息进行详细检查,比如是否给出了出错信息,是否给出了正确的出错信息。