burpsuite未安装完成,不涉及抓包相关内容
前置内容
由于网页的生成有时需要用到用户输入的信息,再根据用户输入到数据库中查找相关内容,所以网页中会含有sql语句。针对sql语句,可以进行sql注入。
如:
$sql="SELECT * FROM news WHERE id={$id}";
这样的语句可以进行数字型注入。
题目实战
打开靶场,选择sql数字型注入题,出现以下页面。
下拉栏中有选项 ---
以及数字1~6。
选择数字一先发送个请求试试:
可以看到发送的表单中id:1
然后发现可以在检查中修改option的value值,以达到注入内容的目的。
首先输入1 and 1=1和1 and 1=2进行类型判断
将内容1 and 1=1带入语句,
可以得到$sql="SELECT * FROM news WHERE id=1 and 1=1";
即sql语句为SELECT * FROM news WHERE id=1 and 1=1
可以发现检查没有语法错误,并返回了查找值
将内容1 and 1=2带入语句,
可以得到SELECT * FROM news WHERE id=1 and 1=2
同样检查没有语法错误,但最后句子判断结果为假,返回找不到。
and语句要求前后全为真。
SELECT * FROM news WHERE id=1
为真,可以返回搜索结果。
1=1为真,1=2为假;
判断结果为数字型注入(无语法错误)并且可以注入(两次结果不同)。
然后判断字段数
sql语句order by num
可以按第num列排列数据,当num大于实际存在的字段数的时候,会报错。
构造输入1 order by 2
并提交,通过1
闭合标签,order by 2
判断是否存在两个字段。
正常查询,字段数大于等于2。
构造输入1 order by 3
提交后发现报错,字段数小于3。
综上,字段数为2。
由于union联合查询要求前后字段数一致,所以判断字段数是必要的。
以下通过union select
挖掘其他信息。
-
输入
1 union select database(),user()
查找当前数据库名称和查询用户,结果如下:
第一组为id=1的查询结果,第二组是通过联合查询获得的内容;
其中pikachu
为数据库名称,root@localhost
是用户名 -
输入
1 union select table_name,table_schema from information_schema.tables where table_schema='pikachu'
information_schema 是MySQL自带的数据库,用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。
通过访问information_schema.tables,获得数据表的元数据信息:
table_schema: 记录数据库名;
table_name: 记录数据表名;获得了该数据库中有以下表:
-
尝试获取users中内容
1 union select table_column,2 from information_schema.columns where table_name='users'
可以看到表中有如下字段:补充:这里2占位是必须的,如果省略则与前面字段数不同
结果如下“: -
查看字段username和password:
1 union select username,password from users
-
然后通过MD5解码获得密码
同理可获取其他表的内容。
以下补充说明获取httpinfo的情况
- 获取列名
- 获取具体信息
发现没有获取任何内容。 - 直接通过MySQL管理窗口查找httpinfo
可以发现是空的。
同样查询其他几个表,发现只有member和users两个表有内容,其他三个都是空表。