SQL手工注入流程

对上述用户输入的值做了过滤和判断,使前端用户只能输入数字,此时没有注入点。

<2、有注入点:

用户输入任意内容:

①若报错,则此处的id值处有注入点。【因为用户输入的内容,被传入到sql语句中,当作参数执行】

②若没有报错,则此处的id值处没有注入点。【没报错,说明用户传入的值被过滤】

P.S、当我们在id处随便输入一个peter值后,出现报错。

说明将我们的输入当作sql语句的一个参数来执行了,因为没有找到,进而返回报错。因此,id值输入处存在一个sql注入点。

2、猜解字段数量(即列名数量):order by

P.S、按照第一个字段进行排序(没报错,说明当前表中有1个字段)

P.S、按照第二个字段进行排序(没报错,说明当前表中有2个字段)

P.S、按照第三个字段进行排序(没报错,说明当前表中有3个字段)

P.S、按照第四个字段进行排序(报错,说明当前表中只有3个字段)

验证:

可查看sqli-labs靶场数据库中users表的信息,发现的确有3个字段(分别为id字段、username字段、password字段)

综上:当前表中只有3个字段(即3列)。

3、通过上述报错,来判断回显点:union联合查询

①补充:union联合查询的2个特点

<1、 union前面查询语句的字段数量与union后面查询字段的数量要一致。

所以需要通过上述的第二步来确定字段数量。

【例如union select 1,2,3】

<2、union前面的查询语句和后面的查询语句结果互不干扰。(即使union前面的查询没有执行成功,也不影响union后面查询语句的执行)

所以可以通过使union前面的语句报错,来仅执行union后面的查询语句、来进一步判断回显点。【例如:id=-1 union select 1,2,3】

综上,2和3位置处,为回显点。

4、信息收集:(通过回显点来进行信息收集)

①获取数据库版本号:version()

P.S、当前数据库的版本为5.7.26

P.S、数据库分为高版本、低版本:

<1、数据库5.0及以上【数据库的高版本才有系统库】

其中information_schema系统库中:schemata表:保存数据库信息。tables表:保存数据表信息。columns表:保存字段信息。

<2、数据库5.0及以下【无系统库】

②补充:MySQL的系统库
  • <1、Information_schema:【重点】
    • 内有61张数据表,重点掌握以下3张表:
    • schemata****表:保存当前整个MySQL服务器中所有数据库的信息。(例如:所有的数据库名、访问权限、类型等)
      • schema_name****字段:保存当前服务器中所有数据库的名字
      • 执行show databases函数后,返回的结果就是取自Information_schema数据库中的schemata表中的schema_name字段。
    • tables****表:保存当前整个MySQL服务器中所有表的信息。(例如:表名)
      • table_name****字段:保存当前服务器中所有数据表的表名。
      • 例如:只查看tables表中的第一条数据
        • select * from tables limit 1,1;
    • columns****表:保存当前整个MySQL服务器中所有字段的信息。(例如:字段名)
      • column_name****字段:保存当前服务器中所有字段的字段名。
      • 例如:只查看columns表中的第一条数据
        • select * from columns limit 1,1;
  • <2、Performance_schema:
    • 内有87张表
    • 作用:主要保存数据库服务器的性能参数。(例如:内存、读写速度等)
  • ❤️、mysql:【重点】
    • 作用:记录当前数据库中所有数据的权限(增、删、改、查)。当前服务器的(root)账号、密码信息也保存在此系统库中。
  • <4、sys:
    • 内有1张表,100个视图
    • 作用:通过视图将Information_schema数据库和Performance_schema数据库结合。
    • 例如:可以查询哪个用户使用的资源最多、对哪张表的访问最多等。
③获取当前数据库的库名:database()

P.S、sqli-labs靶场的数据库库名为security

5、实施相应的sql注入方法

目的:获取当前网站中所有的账号、密码信息

①获取数据库库名:

【已通过database()获取到】

②获取数据库表名:

【可通过系统库information_schema下的表tables中的table_name字段来获取数据库中所有表名】

P.S1、用where条件来指定查询的数据库名,来限定查找的范围。

P.S2、函数group_concat():

当数据库表名有多个的时候,页面中不一定可以显示的下,此时可以使用group_concat()函数。(用于分组、合并显示数据)

P.S3、'='的前后不能有空格

P.S4、查询security数据库下(可由database()获取)的所有表名

union select 1,group_concat(table_name),3 from information_schema.tables

where table_schema=database()

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

P.S5、获取到4个表名(分别为emails表、referers表、uagents表、users表)。在这四个表中,推测users表最有可能存储着用户的账号和密码信息。

③数据库字段名

【获取users表中的字段名】

union select 1,group_concat(column_name),3 from information_schema.columns

where table_schema=database() and table_name=’users’

union select 1,group_concat(column_name),3 from information_schema.columns

where table_schema=database() and table_name=’users’

P.S1、 where条件中指定库名、表名

P.S2、若出现报错,可以将表名users转为十六进制

上述sql注入语句可改为

union select 1,group_concat(column_name),3 from information_schema.columns

where table_schema=database() and table_name=0x7573657273

union select 1,group_concat(column_name),3 from information_schema.columns

where table_schema=database() and table_name=0x7573657273

P.S3、获取到users表中的3个字段名(分别为id、username、password)

推测账号、密码信息分别放在username、password字段中。

④查询对应字段的数据信息

P.S1、0x3a:表示冒号’:’

P.S2、查询username、password字段的信息

union select 1,2,(select group_concat(username,0x3a,password) from users)

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

542700413)]

[外链图片转存中…(img-sk8Is9oq-1715542700413)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 29
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,手工 SQL 注入的过程需要以下步骤: 1. 寻找注入点:通过检查应用程序的输入字段或 URL 中的参数,找到可以插入 SQL 语句的输入点。 2. 确定注入类型:确定注入点的类型是布尔型还是错误型注入。 3. 构造 SQL 语句:根据注入点的类型,构造相应的 SQL 语句。 4. 获取数据库信息:使用 UNION 或 SELECT 语句获取数据库中的信息,如表名、列名、数据等。 5. 执行恶意代码:通过注入恶意代码实现对数据库的操作,如删除、修改、插入数据等。 下面是手工 SQL 注入的详细流程: 1. 寻找注入点:使用浏览器或其他工具,检查应用程序的输入字段或 URL 中的参数,确定哪些输入点可以插入 SQL 语句。 2. 确定注入类型:对于布尔型注入,可以使用 AND 或 OR 运算符来构造 SQL 语句,以检查某个条件是否为真或为假。对于错误型注入,可以故意构造出错误的 SQL 语句,从而使应用程序返回错误信息。 3. 构造 SQL 语句:根据注入点的类型,构造相应的 SQL 语句。例如,对于布尔型注入,可以使用以下语句检查某个条件是否成立: ``` SELECT * FROM users WHERE username='admin' AND password='123456' AND 1=1; ``` 如果 1=1 成立,则返回数据,否则不返回数据。 4. 获取数据库信息:使用 UNION 或 SELECT 语句获取数据库中的信息,如表名、列名、数据等。例如,以下语句可以获取数据库中的表名: ``` SELECT table_name FROM information_schema.tables WHERE table_schema='database_name'; ``` 其中,database_name 是数据库名称。 5. 执行恶意代码:通过注入恶意代码实现对数据库的操作,如删除、修改、插入数据等。例如,以下语句可以删除数据库中的数据: ``` DELETE FROM users WHERE username='admin'; ``` 需要注意的是,手工 SQL 注入可能会破坏数据完整性和机密性,因此应该避免使用。应用程序应该使用参数化查询或 ORM 框架等技术来防止 SQL 注入攻击。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值