仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 814|回复: 18
打印 上一主题 下一主题

[学习教程] PHP网站制作之PHP+MYSQL网站SQL Injection攻防

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:43:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
熟悉HTML/CSS/JS等网页基本元素,完成阶段可自行制作完整的网页,对元素属性达到熟悉程度   </p> 法式员们写代码的时分考究TDD(测试驱动开辟):在完成一个功效前,会先写一个测试用例,然后再编写代码使之运转经由过程。其实当黑客SQL Injection时,一样是一个TDD的进程:他们会先测验考试着让法式报错,然后一点一点的修改参数内容,当法式再次运转胜利之时,注入也就随之胜利了。

防御:

假定你的法式里有相似上面内容的剧本:

$sql = "SELECT id, title, content FROM articles WHERE id = {$_GET['id']}";

正常会见时其URL以下:

/articles.php?id=123

当黑客想判别是不是存在SQL Injection破绽时,最经常使用的体例就是在整形ID前面加个单引号:

/articles.php?id=123'

因为咱们没有过滤$_GET['id']参数,所以必定会报错,能够会是相似上面的信息:

supplied argument is not a valid MySQL result resource in ...

这些信息就足以申明剧本存在破绽了,咱们可以再耍点手腕:

/articles.php?id=0 union select 1,2,3

之所以select 1,2,3是由于union请求双方的字段数分歧,后面是id,title,content三个字段,前面1,2,3也是三个,所以不会报语法毛病,还有设置id=0是一条不存在的纪录,那末查询的了局就是1,2,3,反应到网页上,本来显示id的中央会显示1,显示title的中央会显示2,显示content的中央会显示3。

至于若何持续使用,还要看magic_quotes_gpc的设置:

当magic_quotes_gpc为off时

/articles.php?id=0 union select 1,2,load_file('/etc/passwd')

如斯一来,/etc/passwd文件的内容就会显示在本来显示content的中央。

当magic_quotes_gpc为on时

此时假如直接利用load_file('/etc/passwd')就有效了,由于单引号被本义了,然而还有举措:

/articles.php?id=0 union select 1,2,load_file(char(47,101,116,99,47,112,97,115,115,119,100))

个中的数字就是/etc/passwd字符串的ASCII:字符串每一个字符轮回输入ord(...)

除此觉得,还可使用字符串的十六进制:字符串每一个字符轮回输入dechex(ord(...))

/articles.php?id=0 union select 1,2,load_file(0x2f6574632f706173737764)

这里仅仅说了数字型参数的几种进击手腕,属于冰山一角,字符串型参数等进击手腕看前面的文档链接。

戍守:

收集上有一些相似SQL Injection Firewall的软件可供利用,好比说GreenSQL,假如网站已入手下手蒙受SQL Injection进击,那末利用如许的快捷东西常常会救你一命,不外如许的软件在架构上属于一个Proxy的脚色,多半会影响网站并发功能,所以在选择与否这个成绩上最好视客不雅前提来稳重决意。良多时分专业的软件并非必需的,还有良多轻量级处理计划,上面演示一下若何利用awk来检测能够的破绽。

创立detect_sql_injection.awk剧本,内容以下(假如要拷贝一下内容的话记得不要包含行号):

01 #!/bin/gawk -f
02
03 /\$_(GETPOSTCOOKIEREQUEST)\s*\[/ {
04     IGNORECASE = 1
05     if (match($0, /\$.*(sqlquery)/)) {
06         IGNORECASE = 0
07         output()
08         next
09     }
10 }
11
12 function output()
13 {
14     $1 = $1
15     print "CRUD: " $0 "\nFILE: " FILENAME "\nLINE: " FNR "\n"
16 }


此剧本可婚配出相似以下的成绩代码,想要扩大婚配形式也轻易,只需照猫画虎写if match语句便可。

1:$sql = "SELECT * FROM users WHERE username = '{$_POST['username']}'";
2:$res = mysql_query("SELECT * FROM users WHERE username = '{$_POST['username']}'");


利用前别忘了先chmod +x detect_sql_injection.awk,有两种挪用办法:

1:./detect_sql_injection.awk /path/to/php/script/file
2:find /path/to/php/script/directory -name "*.php" xargs ./detect_sql_injection.awk


会把有成绩的代码信息显示出来,模样以下:

CRUD: $sql = "SELECT * FROM users WHERE username = '{$_POST['username']}'";
FILE: /path/to/file.php
LINE: 123


实际情况中有良多使用这个剧本的办法,好比说经由过程CRON按期扫描法式源文件,或在SVN提交时经由过程钩子办法主动婚配。

利用专业东西也好,检测剧本亦罢,都是主动的戍守,成绩的基本一直取决于在法式员思想里是不是有需要的平安认识,上面是一些必需要切记的原则:

1:数字型参数利用相似intval,floatval如许的办法强迫过滤。
2:字符串型参数利用相似mysql_real_escape_string如许的办法强迫过滤,而不是复杂的addslashes。
3:最好丢弃mysql_query如许的拼接SQL查询体例,尽量利用PDO的prepare绑定体例。
4:利用rewrite手艺埋没真实剧本及参数的信息,经由过程rewrite正则也能过滤可疑的参数。
5:封闭毛病提醒,不给进击者供应敏感信息:display_errors=off。
6:以日记的体例纪录毛病信息:log_errors=on和error_log=filename,按期排查,Web日记最好也查。
7:不要器具有FILE权限的账号(好比root)毗连MySQL,如许就屏障了load_file等风险函数。
8:......

网站平安其实其实不庞杂,总结出来就是一句话:过滤输出,本义输入。个中,咱们下面一向会商的SQL Injection成绩就属于过滤输出成绩,至于本义输入成绩,其代表是Cross-site scripting,但它不属于本文的范围,就不多说了。

文档:

addslashes() Versus mysql_real_escape_string()
SQL Injection with MySQL
Advanced SQL Injection with MySQL
MySQL注入中导出字段内容的研讨——经由过程注入导出WebShell
虽说不上很好,但至少一般的数据操作,再在原有的SQL语言的基础上,用得还是可以的。
精灵巫婆 该用户已被删除
沙发
发表于 2015-2-4 06:12:17 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
小女巫 该用户已被删除
板凳
发表于 2015-2-9 17:13:56 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
莫相离 该用户已被删除
地板
发表于 2015-2-14 05:13:02 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
爱飞 该用户已被删除
5#
发表于 2015-2-18 01:57:44 | 只看该作者
当然这种网站的会员费就几十块钱。
谁可相欹 该用户已被删除
6#
发表于 2015-3-11 11:01:58 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
透明 该用户已被删除
7#
发表于 2015-3-13 00:07:16 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
柔情似水 该用户已被删除
8#
发表于 2015-3-20 05:38:50 | 只看该作者
爱上php,他也会爱上你。
小魔女 该用户已被删除
9#
发表于 2015-3-25 02:35:33 | 只看该作者
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
再现理想 该用户已被删除
10#
发表于 2015-3-27 00:11:33 | 只看该作者
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
灵魂腐蚀 该用户已被删除
11#
 楼主| 发表于 2015-3-27 13:09:51 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
乐观 该用户已被删除
12#
发表于 2015-4-13 16:29:14 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
兰色精灵 该用户已被删除
13#
发表于 2015-4-24 00:21:42 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
若天明 该用户已被删除
14#
发表于 2015-4-26 08:11:51 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
老尸 该用户已被删除
15#
发表于 2015-5-4 06:31:33 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
活着的死人 该用户已被删除
16#
发表于 2015-5-7 22:30:05 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
飘灵儿 该用户已被删除
17#
发表于 2015-6-30 01:25:09 | 只看该作者
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
蒙在股里 该用户已被删除
18#
发表于 2015-7-3 01:30:39 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
因胸联盟 该用户已被删除
19#
发表于 2015-7-5 01:30:13 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 04:02

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表