资讯专栏INFORMATION COLUMN

sql注入学习铺垫

UCloud / 2917人阅读

摘要:型的请求最容易被注入通常我们关注的网页,尤其是中携带,其中,参数可以是整数类型也可以是字符串类型。后面只能跟整数或者字符串,这样输入了违反了查询规则,得到了一条警告,也证明了语句没有对特定字符串进行过滤,我们可以通过绕过来实现注入。

sql是用于访问和数据处理数据库的标准的计算机语言。sql是有二十世纪七十年代由IMB创建的,于1992年作为国际标准纳入ANSI
数据定义定义语言:DDL用于定义数据库结构
sql由两部分组成
数据操作语言DML:DML用于对数据库进行查询或者更新

DDL的主要指令有

CREATE DATABASE  	创建新数据库ALTER DATABASE          修改数据库CREATE TABLE 		创建新表ALTER TABLE            	改变数据库表DROP TABLE            	删除表

DML的主要指令有

SELECT				从数据库表中获取信息UPDATA				更新数据库表中的数据DELETE				从数据表中删除数据INSERT INTO			向数据库表中插入数据	

需要使用一些特殊的字符串来构建sql语句

" "	字符串指示器("string";	语句终结符||	对于oracle,postgresql而言文链接--	单行注释符#   单行注释符/**/	多行注释符

sql注入原理

sql注入是一种将sql代码插入或添加到应用的输入参数中的攻击,之后再将这些参数传递给后台sql服务器加以解析并执行。

例子
如下是网页后端代码

<form action="xxx.php" method="get">//get请求会直接把请求的内容放进处理语句中<input type="text" name="user" /><input type="text" name="passwd" /><input type="submit" value="Submit" /></form>

核心代码如下

/*...*/$sql="select*from table where user=$_ GET["user”]and password=$_ GET["passwd"]";Sresult=mysql query(sql);//执行查询/*... */?>

这是从前端用户访问到后端处理用户请求,sql语句执行的过程。
当用户通过浏览器向表单提交用户名"kill",密码"123456"时,则是通过一下的URL语句发送给web服务器:

http://xxx.com/xxxphp?user=kill&passwd=123456

当web服务器收到这个请求时,将会构建并执行一条sql语句进行查询,sql语句如下:

SELECT*FROM table WHERE user="kill"and passwd="123456"

当用户发送的请求是user修改后的sql查询,那么这样就可能导致sql注入漏洞
如果用户将user的内容以’‘kill’–’"来提交,则单引号用于截断前面的字符串,注释符–后面的内容就会被注释掉:

http://xxx.com/xxx.php?user=kill"&passwd=123456

web应用程序会构建并发送下面这条sql语句:

SELECT*FROM table WHERE user="kill"--"and passwd="123456"

由于kill前面的单引号和–后 面的单引号是sql语句原有的,结果我们输入的‘–,这里’kill‘就已经形成了查询语句且–后面的内容全部注释掉,这样一来只要只要查询kill sql语句就成功了。
由于开发人员没有对一些特定字符进行过滤。

寻找注入点

如果要对一个网站进行sql注入攻击,首先需要找到存在sql注入漏洞的地方,也就是注入点,可能的sql注入点一般存在于登录页面,查找页面或添加页面等用户可以查找或修改数据的地方。
GET型的请求最容易被注入

通常我们关注ASP,JSP,CGI,PHP的网页,尤其是URL中携带http://xxx/xxx.php?id=num,其中,参数可以是整数类型也可以是字符串类型。

“单引号”法

在URL参数后面添加一个单引号,若存在注入点则通常会返回一个错误,列如,下列错误通常表明存在sql注入漏洞:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’ LIMIT 0,1′ at line 1

如果攻击者使用单引号注入http://localhost/xxx.php?id=1’,那么最终的语句就会变成select*from user where id =1’ 这导致sql语句执行失败且mysql函数不会返回任何值,后面有mysql_fetch_array将会返回给用户一条警告信息。

?id后面只能跟整数或者字符串,这样输入了1’违反了sql查询规则,得到了一条警告,也证明了sql语句没有对特定字符串进行过滤,我们可以通过绕过来实现sql注入。

永真永假法

我们使用http://localhost/xxx.php?id=1 and 1=1,传递给后台数据库服务器sql语句就会变成selectform user where id=1 and 1=1,并不影响逻辑,前面为真,后面也为真,但是已经检测到sql注入
使用http://localhost/xxx.php?id=1 and 1=2,传递给后台数据库服务器的sql语句就会变成:select
form user where id=1 and 1=2,前面为真后面为假,页面可能会报错或跳转。可以进行sql注入。

Sql语句(铺垫学习)

show databases;查看所有库                               大写字母可以tab补齐select  database();返回当前所在的库select user();          返回当前所在目录的用户select now();          返回当前时间use dvwa;               使用一个库show tables;        查看当前库的表select * from users;           查看某一个表的具体内容select * form users/G;        进行分行打印  select user,password from users;     查看当前数据库的用户名及密码(密码值是以md5值储存)select user,password avatar from users;     (中间的avatar是别名 可自定义)   select user,password,avatar ,from users;     (user,password,avatar ,逗号隔开算一个字段)select user_id,first_name,last_name from users;  (查询表中某一个字段的值) select user,password ,host from mysql.user where user="root";  查询字段不要在where语句后面的查询值加" " 查询值得时候一定要在后面加上" "select user,password ,host from mysql.user where user="root" and host="127.0.0.1" 多个条件成立且为真的时候返回对应的值。select 1            数据库字段名不能是数字,但是查询时select 1会返回当前查新的值且不会报错。//联合查询UNIONmysql> select user, password from mysql. user;mysq1> select user login,user pass from wordpress.wp_ users;mysq1> select user, password from mysql. user union select user_ login,user pass from wordpress.wp users;mysq1> select user,password,host from mysql.user union select user. login,user. pass fromwordpress .Wp_ users;ERROR 1222 (21000): The used SELECT statements have a different number of columns注: union查询前后字段数必须相同  这样查询会这样报错。mysql>  select user, password,host from mysql.user union select user_login,user_pass,3 from wordpress.wp_users;     前后字段值都为3,查询正常 select 1不报错,就可以冒充一个字段,来进行查询。select user,password,host from mysql.user where 1=2 union select user_login,user_pass,1 from wordpress.wp_users limit 5;   前面红色字段不可改变即union前面  改变后面字段使我们得到想要的结果。以下注明了union的用法。mysql   union  语法mysql   union 用于把来自多个select  语句的结果组合到一个结果集合中。语法为:select  column,......from table1union all]select  column,...... from table2在多个select  语句中,对应的列应该具有相同的字段属性,且第一个select 语句中被使用的字段名称也被用于结果的字段名称。mysql>  select * from dvwa.users union select user_login,user_pass,3 from wordpress.wp_users; ERROR 1222 (21000): The used SELECT statements have a different number of columns这时候我们进行联合查询的时候会报错:没有相同字段。为了使语句执行成功,我们要猜字段,前面的字段是系统给的我们改不了,改union后面的字段。猜字段select * from dvwa.users union select 1;select * from dvwa.users union select 1,2;select * from dvwa.users union select 1,2,3;select * from dvwa.users union select 1,2,3,4;select * from dvwa.users union select 1,2,3,4,5;select * from dvwa.users union select 1,2,3,4,5,6;最终我们猜出字段,表出现,和我们在后台查询的表一样。字段数和字段名都得猜由上我们猜出了表字段select * from dvwa.users union select user_login,user_pass,1,2,3,4 from wodpress.wp_users;利用字段名来爆出表。select * from dvwa.users where 1=3 union select user_login,user_pass,1,2,3,4 from wordpress.wp_users;和上面的语句相同 where1=3使前面的语句不成立,从而得到我们下面想要得到的值。information_schema  数据库字典select * from information_schema.tables/G 查看数据库所有表的信息。其中一个表的信息。*************************** 1. row ***************************  TABLE_CATALOG: NULL   TABLE_SCHEMA: information_schema                   归属哪个库     TABLE_NAME: CHARACTER_SETS                      表名     TABLE_TYPE: SYSTEM VIEW         ENGINE: MEMORY        VERSION: 10     ROW_FORMAT: Fixed     TABLE_ROWS: NULL AVG_ROW_LENGTH: 384    DATA_LENGTH: 0MAX_DATA_LENGTH: 16604160   INDEX_LENGTH: 0      DATA_FREE: 0 AUTO_INCREMENT: NULL    CREATE_TIME: NULL    UPDATE_TIME: NULL     CHECK_TIME: NULLTABLE_COLLATION: utf8_general_ci       CHECKSUM: NULL CREATE_OPTIONS: max_row     s=43690  TABLE_COMMENT: select DISTINCT TABLE_SCHEMA from information_schema.TABLES;相当于show databases;DISTINCT:可以将重复的表给除去。select TABLE_NAME,TABLE_SCHEMA from information_schema.TABLES/G;查询数据库里面的表名和库名.select TABLE_SCHEMA,GROUP_CONCAT(TABLE_NAME) from information_schema.TABLES GROUP BY TABLE_SCHEMA/G;以库名来分类表名进行查询。select TABLE_NAME from information_schema.tables where table_schema ="dvwa"  相当于show  tables;查询数据库库名,表名,字段名 information.schema.columnsselect * from information.schema.columns/G查询所有的字段名表给除去。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125004.html

相关文章

  • SQL注入学习笔记

    摘要:结果反馈分类盲注入盲注入不会展现任何数据库报错内容,它是依据构造真或假的问题对数据库进行提问,注入方式主要有两种基于布尔值与基于时间。 文章目录 前言SQL注入是...

    sihai 评论0 收藏0
  • Web安全之SQL注入漏洞学习(一)

    摘要:表示层业务逻辑层数据访问层注入定义原理注入是发生在应用程序与数据库层的安全漏洞。包含了超过种漏洞,涵盖了所有主要的已知漏洞,包括安全风险,最重要的是已经包含了和漏洞。 Web程序三层架构 三层架构主要是指将业务应用规划为的表示层 UI、数据访问层 DAL 以及业务逻辑层 BLL,其分层的核心...

    lyning 评论0 收藏0
  • 网络学习-sql注入

    摘要:四字段爆破进一步猜测数据注入位置如果返回错误,说明字段小于如果返回错误,说明字段小于如果返回错误,说明字段为五数据库表爆破在查询之前,我们先来了解一下注入中的用法注入联合查询中,我们会碰到。 ...

    不知名网友 评论0 收藏0
  • [理论-学习]Web安全原理剖析-01

    摘要:数据库名的字段名为。例如表示取出第一条记录开始,取出条记录。第二步引用恶意数据开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。注入攻击输入的参数转为编码进行攻击。 声明: 由于笔者能力有限,难免出现各种错误和漏洞。全文仅作为个...

    CarlBenjamin 评论0 收藏0
  • Java代码审计连载之—添油加醋

    摘要:在代码审计中,按业务流程审计当然是必须的,人工的流程审计的优点是能够更加全面的发现漏洞,但是缺点是查找漏洞效率低下。代码审计学习之旅总有人问我代码审计该怎么学习,该从哪学习,现在统一回复,表示我也不知道。。。 在代码审计中,按业务流程审计当然是必须的,人工的流程审计的优点是能够更加全面的发现漏洞,但是缺点是查找漏洞效率低下。如果要定向的查找漏洞,逆向跟踪变量技术就显得更加突出,如查找X...

    dunizb 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<