设为首页 收藏本站
查看: 1281|回复: 0

[经验分享] PHP网络开发详解:SQL注入漏洞

[复制链接]

尚未签到

发表于 2017-4-1 12:30:19 | 显示全部楼层 |阅读模式
SQL注入是网络攻击的一种常见手法,攻击者通过对页面中的SQL语句进行拼组来获得管理账号、密码及更多的其他信息。这种攻击<nobr oncontextmenu="return false;" onmousemove="kwM(1);" id="key1"  style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline"  onmouseout="kwL(event, this);" target="_blank">方法</nobr>对于网站的危害是非常大的。

SQL注入攻击的一般方法  <clk></clk>以下代码是一个简单的数据输出页面,该页面通过从<nobr oncontextmenu="return false;" onmousemove="kwM(2);" id="key2"  style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline"  onmouseout="kwL(event, this);" target="_blank">浏览器</nobr>地址栏获得参数来显示相应的内容。
<?php
$id = $_GET['id'];//获得参数
$sql = "SELECT * FROM posts WHERE postid = $id"; //定义SQL
mysql_connect("localhost", "root");//连接服务器
mysql_select_db("guestbook");//连接数据库
$rs = mysql_query($sql);//执行SQL
if(mysql_numrows($rs))//如果记录存在,则输出
{
$row_rs = mysql_fetch_assoc($rs);
echo "TOPIC: ".$row_rs['topic']."<br>";
}
else//否则提示错误
{
echo "Record not found!";
}
?>
  上面的代码通过获得id参数的值来进行数据查询,并在页面上显示相应的数据信息。如果数据无法从数据库中找到,则显示相应的错误信息。例如,从浏览器上访问http://127.0.0.1/ bugs/eg2.php?id=9可以获得如下结果。
Topic: This is a test!!
  <clk></clk>这里,SQL注入的方法是通过对id参数的赋值来构造一个用户自定义的SQL语句给<nobr oncontextmenu="return false;" onmousemove="kwM(0);" id="key0"  style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline"  onmouseout="kwL(event, this);" target="_blank">程序</nobr>执行来实现的。例如,从浏览器上访问http://127.0.0.1/bugs/eg2.php?id=9 and 1=1,仍然可以看到上面的结果。但是,此时程序实际上执行的SQL语句如下所示。
SELECT * FROM posts WHERE postid = 9 and 1=1
  可以看出,由于程序简单地将id参数放置在SQL语句中,实际上程序已经允许用户自由地运行SQL语句了。从浏览器上访问http://127.0.0.1/bugs/eg2.php?id=9 and 1=2,可以看到页面的运行结果如下所示。
Record not found!
  这是因为程序执行了如下的SQL语句致使记录没有成功返回而造成的。
SELECT * FROM posts WHERE postid = 9 and 1=2
  有了这一基础,就可以通过猜测存储管理员的用户名和密码的表名和列名来对网站进行SQL注入攻击了。例如,当前用于存储管理员用户的数据表名为admin,在浏览器上访问http://127.0.0.1/bugs/eg2.php?id=9 and (select length(adminname) from admin limit 0,1)>0可以使PHP程序对admin表进行查询并获得当前用于存储管理员账号和密码的列名。如果上面的访问可以使页面内容正常显示,则说明猜测正确。实际上,上面的访问执行了下面的SQL语句。
SELECT * FROM posts WHERE postid = 9 and (select length(adminname) from admin
limit 0,1)>0  就这样,通过对数据库字段长度的逻辑判断获得了存储管理员账号和密码的表名和列名。下一步,就可以通过对管理员账号和密码的每个字符的ASCII码的判断来获得管理员账号了。例如,当前管理员的账号为admin,在浏览器上访问http://127.0.0.1/bugs/eg2.php?id=9 and (select ascii(substr(adminname,1,1)) from admin limit 0,1)=97可以使网页正常显示,这是因为当前管理员账号为admin,通过使用ascii函数和substr函数来获取第一个字母的ASCII码为 97。当SQL中的逻辑成立时,页面就可以正常地显示了。

漏洞防护措施
  前面所述的攻击方法虽然很烦琐,但是只要有充足的时间,完全可以通过前面所示的PHP代码来获取管理员的账号和密码,并对网站数据进行修改。解决这一问题的方法很简单,就是对通过地址栏传入的参数的值进行判断或者格式化处理,如以下代码所示。
<?php
$id = (int)$_GET['id']; //通过对id参数进行数据类型转换过滤掉非法SQL字符
$sql = "SELECT * FROM posts WHERE postid = $id";//定义SQL
echo "SQL: ".$sql."<br>"; //输出SQL
mysql_connect("localhost", "root"); //连接服务器
mysql_select_db("guestbook"); //连接数据库
$rs = mysql_query($sql); //执行SQL
if(mysql_numrows($rs)) //判断是否存在记录
{
$row_rs = mysql_fetch_assoc($rs);
echo "TOPIC: ".$row_rs['topic']."<br>";
}
else//如果记录不存在,则输出错误信息
{
echo "Record not found!";
}
?>
  上面的代码首先将传入的参数的值转换为整型数据,然后再放入SQL语句中执行。这一简单的举措可以将地址栏中的非数字字符全部过滤掉,大大增强了系统的安全性。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-358724-1-1.html 上篇帖子: php js_unescape correspond to js escape 下篇帖子: PHP网络编程:创建登录表单
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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