├── .gitignore
├── .project
├── README.md
└── clickbandit.js
/.gitignore:
--------------------------------------------------------------------------------
1 | .project
2 |
--------------------------------------------------------------------------------
/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | clickbandit github
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # clickbandit
2 | A JavaScript clickjacking PoC generator
3 |
--------------------------------------------------------------------------------
/clickbandit.js:
--------------------------------------------------------------------------------
1 | /* Copyright PortSwigger Ltd. All rights reserved. Usage is subject to the Burp Suite license terms. See https://portswigger.net for more details. */
2 | !function(){
3 | var initialZoomFactor = '1.0', win, doc, width, height, clicks = [];
4 | function addClickTrap(element, minusY) {
5 | var clickTrap = doc.createElement('div'), cords = findPos(element);
6 | clickTrap.style.backgroundColor = 'none';
7 | clickTrap.style.border = 'none';
8 | clickTrap.style.position = 'absolute';
9 | clickTrap.style.left = cords[0] + 'px';
10 | clickTrap.style.top = cords[1] + 'px';
11 | clickTrap.style.width = element.offsetWidth + 'px';
12 | clickTrap.style.height = element.offsetHeight + 'px';
13 | if(element.zIndex || element.zIndex === '0') {
14 | clickTrap.style.zIndex = +element.zIndex+1;
15 | }
16 | clickTrap.style.opacity = '0.5';
17 | clickTrap.style.cursor = 'pointer';
18 | clickTrap.clickTrap = 1;
19 | clickTrap.addEventListener('click', function(e) {
20 | generatePoc({x:e.pageX, y: minusY?e.pageY-minusY : e.page});
21 | e.preventDefault();
22 | e.stopPropagation();
23 | return false;
24 | }, true);
25 | doc.body.appendChild(clickTrap);
26 | }
27 | function addMessage(msg) {
28 | var message = document.createElement('div');
29 | message.style.width = '100%';
30 | message.style.height = '20px';
31 | message.style.backgroundColor = '#fff5bf';
32 | message.style.border = '1px solid #ff9900';
33 | message.style.padding = '5px';
34 | message.style.position = 'fixed';
35 | message.style.bottom = '0';
36 | message.style.left = '0';
37 | message.style.zIndex = 100000;
38 | message.style.textAlign = 'center';
39 | message.style.fontFamily = 'Arial';
40 | message.style.color = '#000';
41 | message.appendChild(document.createTextNode(msg));
42 | document.body.appendChild(message);
43 | setTimeout(function() {
44 | document.body.removeChild(message);
45 | }, 4000);
46 | }
47 | function htmlEscape(str) {
48 | str = str + '';
49 | return str.replace(/[^\w :\-\/.?=]/gi, function(c){
50 | return '' + (+c.charCodeAt(0))+';';
51 | });
52 | }
53 | function getDocHeight(D) {
54 | return Math.max(
55 | D.body.scrollHeight, D.documentElement.scrollHeight,
56 | D.body.offsetHeight, D.documentElement.offsetHeight,
57 | D.body.clientHeight, D.documentElement.clientHeight
58 | );
59 | }
60 | function getDocWidth(D) {
61 | return Math.max(
62 | D.body.scrollWidth, D.documentElement.scrollWidth,
63 | D.body.offsetWidth, D.documentElement.offsetWidth,
64 | D.body.clientWidth, D.documentElement.clientWidth
65 | );
66 | }
67 | function findPos(obj) {
68 | var left = 0, top = 0;
69 | if(obj.offsetParent) {
70 | while(1) {
71 | left += obj.offsetLeft;
72 | top += obj.offsetTop;
73 | if(!obj.offsetParent) {
74 | break;
75 | }
76 | obj = obj.offsetParent;
77 | }
78 | } else if(obj.x && obj.y) {
79 | left += obj.x;
80 | top += obj.y;
81 | }
82 | return [left,top];
83 | }
84 | function generatePoc(config) {
85 | var html = '', child = '', elementWidth = 1, elementHeight = 1, maxWidth = width, maxHeight = height, cords, zoomIncrement = 1, desiredX = 200, desiredY = 200, parentOffsetWidth, parentOffsetHeight,
86 | element = config.element, x = config.x, y = config.y, pixelMode = false;
87 | if(config.clickTracking) {
88 | elementWidth = config.clickTracking[0].width;
89 | elementHeight = config.clickTracking[0].height;
90 | x = config.clickTracking[0].left;
91 | y = config.clickTracking[0].top;
92 | zoomIncrement = 1;
93 | config.currentPosition = 0;
94 | } else {
95 | config.clickTracking = [];
96 | if(element) {
97 | elementWidth = element.offsetWidth;
98 | elementHeight = element.offsetHeight;
99 | cords = findPos(element);
100 | x = cords[0];
101 | y = cords[1];
102 | zoomIncrement = 1;
103 | } else {
104 | zoomIncrement = 5;
105 | pixelMode = true;
106 | }
107 | }
108 | parentOffsetWidth = desiredX - x;
109 | parentOffsetHeight = desiredY - y;
110 | child = btoa('