Giter Site home page Giter Site logo

doyensec / inql Goto Github PK

View Code? Open in Web Editor NEW
1.5K 29.0 154.0 19.39 MB

InQL is a robust, open-source Burp Suite extension for advanced GraphQL testing, offering intuitive vulnerability detection, customizable scans, and seamless Burp integration.

Home Page: https://doyensec.com/

License: Apache License 2.0

Python 97.27% HTML 0.69% Kotlin 2.04%
graphql security-scanner graphql-security api-documentation-tool security-tools security-audit burp-extensions burpsuite bugbounty bugbounty-tool

inql's Introduction

InQL v5.0 - Burp Extension for Advanced GraphQL Testing

Doyensec Research Island GitHub GitHub release (latest by date) GitHub Release Date GitHub milestone dev branch ahead by GitHub contributors GitHub issues by-label GitHub issues by-label

🚀 Introduction

Welcome to InQL v5.0, a major update for our open-source GraphQL testing tool. This version provides new and improved features aimed at enhancing your GraphQL testing capabilities, making it more efficient and effective.

We appreciate your trust in InQL. Happy testing!

⚠️ Significant Updates and Breaking Changes

We've strategically revised certain aspects of InQL v5.0, leading to the deprecation of some features from v4. Notably, standalone and CLI modes, the embedded GraphiQL server, and the Timer tab are no longer available.

This streamlining allows us to focus on refining InQL's core functionality, though we recognize it may affect your established workflows. This is especially pertinent as some of these features were highlighted in the renowned Black Hat GraphQL book.

Our goal is to achieve full feature parity with v4 in the upcoming v5.1 version. In the interim, please consider using the last v4.0.7 release or building InQL from the v4 branch.

❗ GQLSpection - The Successor of Standalone and CLI Modes

In order to simplify our code base, standalone mode and CLI, which allowed for InQL use outside of Burp, have been removed in InQL v5.0. These functionalities are now bundled within GQLSpection, a multi-use CLI tool and a Python 2/3/Jython compatible library.

GQLSpection facilitates sending introspection queries, parsing results, generating queries and mutations, and executing Points of Interest searches.

❗ Deprecation of the Timer Tab

The Timer tab from InQL v4 has been discontinued in v5.0, as Burp's built-in Logger tool offers a more accurate and thorough alternative for visualizing query execution times. Here's a quick guide to use Burp's Logger instead:

  • Enter the GraphQL endpoint as your search term.
  • Show the "Start response timer" & "End response timer" columns.
    • End response timer: This denotes the time taken by the server to completely send back the response. It mirrors the data provided by the deprecated Timer tab but is more precise.
    • Start response timer: This represents the time taken by the server to process the response before starting to send it back, a crucial metric for DoS conditions.

❗ GraphiQL and Circular Relationship Detection

Owing to time constraints, these features are temporarily absent from the v5.0 release. However, we're dedicated to reintroducing them in v5.1.

🌟 Features

The InQL user interface is equipped with two primary components: the Scanner and the Attacker.

🔎 Scanner

scanner.mp4

The Scanner is the core of InQL v5.0, where you can analyze a GraphQL endpoint or a local introspection schema file. It auto-generates all possible queries and mutations, organizing them into a structured view for your analysis.

✅ Customizable Scans

InQL v5.0 offers the flexibility to customize your scans. Adjust the depth of generated queries or the number of spaces used for indentation. You can also perform 'Points of Interest' scans to detect potential vulnerabilities in the GraphQL schema.

✅ Points of Interest Analysis

After running a Points of Interest scan, you are presented with a rich data set covering a variety of potential vulnerabilities. You can enable or disable these categories according to your needs.

✅ Enhanced Interactions with Burp

InQL v5.0 seamlessly integrates with Burp, enabling you to generate queries directly from any GraphQL request in Burp. You can also send auto-generated queries to other Burp tools for further analysis.

✅ Custom Headers

You have the ability to set custom headers per domain, with the domain list auto-populated from observed traffic.

⚔️ Attacker

attacker.mp4

The Attacker component lets you run batch GraphQL attacks, which can be useful for circumventing poorly implemented rate limits.

📝 Burp's Native Message Editors

Burp's native message editors now come with an additional 'GraphQL' tab, providing an efficient way to view and modify GraphQL requests.

image

⬇️ Installation

To successfully install InQL v5.0, ensure you meet the following requirements:

Burp:

  • Support is only provided for the most recent version of Burp.
  • Compatible with both "Professional" and "Community" editions.

Java:

  • The Montoya API needs Java 17 or later.

💻 Building the InQL extension from git

  1. Install Java 17+, for example in Debian-based distros:
$ sudo apt install -y openjdk-17-jdk
$ java --version
openjdk 17.0.6 2023-01-17
  1. Clone the repo and pull submodules:
$ git clone https://github.com/doyensec/inql
$ cd inql
$ git checkout dev
$ git submodule init
$ git submodule update
  1. Build the InQL extension:
$ ./gradlew

Load the file build/InQL.jar into Burp as a Java extension.

🛠️ Setting up development environment

After building InQL as described above, you can prepare your development environment.

Begin by setting up a virtual environment with Python 2.7 for Jython compatibility. Note that necessary headers are required to build libraries with pip. For instance, using virtualenv:

$ sudo apt install -y python2.7 python2.7-dev python2-setuptools-whl python2-pip-whl python3-virtualenv
$ virtualenv -p python2.7 ./venv/

Using venv, pyenv, etc will also work.

Once you have the venv set up, activate it and install development requirements:

$ . ./venv/activate
$ pip install -r requirements_dev.txt

Install the GQLSpection from a submodule (as a development library so you can edit it directly):

$ pip install -e lib/GQLSpection/

Install pre-commit script to automatically run checks before each commit:

$ pre-commit install

Now a bunch of tests, including isort and pylint, should run on each commit. However, it will also change the files if necessary and cancel commit in this case for you to inspect. So, make sure to check what's up, manually add the changes (git add) and run git commit again (as the original commit didn't go through).

Your environment is ready for development of InQL! Note that GQLSpection requires its own setup. Oh, and if the GQLSpection submodule gets out of date you'll see a message about it in git status. Fix it by running:

$ git submodule update

(this can also be done automatically when needed by modifying ~/.gitconfig)

🤝 Contributing

InQL thrives on community contributions. Whether you're a developer, researcher, designer, or bug hunter, your expertise is invaluable to us. We welcome bug reports, feedback, and pull requests. Your participation helps us continue to improve InQL, making it a stronger tool for the community.

Interactions are best carried out through the Github issue tracker, but you can also reach us on social media (@Doyensec). We look forward to hearing from you!

👥 Contributors

A special thanks to our contributors. Your dedication and commitment have been instrumental in making InQL what it is today.

Current:

Historical:

This project was made with support of Doyensec.

Doyensec Research

inql's People

Contributors

0xflotus avatar day6reak avatar dependabot[bot] avatar execveat avatar fuomag9 avatar hannah-portswigger avatar hlein avatar ikkisoft avatar kasperkarlsson avatar mateuszswidniak avatar mathdeziel avatar matteoldani avatar portswiggersupport avatar ramimac avatar righettod avatar thypon avatar uthmanportswigger avatar voidsec avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

inql's Issues

Display comments from the GraphQL schema

GraphQL schema can include descriptive comments which get displayed in GraphiQL, but not InQL. It's not immediately clear how to show them - inline, as a mousover, etc. But having this functionality would be very useful.

All installation failed but have to go with pip install

Describe the bug
ModuleNotFoundError: No module named 'inql'

To Reproduce

  1. pip3 install -r requirements.txt no errors
  2. jython install it failed
  3. run standalone cli failed too

Expected behavior
I'm little confused tho.

Desktop (please complete the following information):

  • OS: Linux Kali 5.18.0-kali5-amd64 x86_64
  • Python Version: [e.g. Jython v2.7.2-DEV/Python 3.10.5]

Additional context
Add any other context about the problem here.

Requests sent through GraphiQL don't inherit custom headers

Describe the bug
When the query is sent from InQL Scanner to Repeater, custom headers are injected within it. But if the query gets sent to GraphiQL, requests sent through that interface lack these custom headers, so auth does not work.

Jython 2.7.0 incompatibility: 'module' object has no attribute 'create_default_context

When I load URL I get this output:
..
InQL Scanner Started! (tmpdir: /private/var/folders/n6/n3x71ldn5flc4z9lz79bgpqc0000gn/T/tmp7Jyc3e )
Quering GraphQL schema from: https://example.com
Proxy ENABLED: localhost:8080
Detect arguments is ENABLED, known types will be replaced with placeholder values
'module' object has no attribute 'create_default_context'
..

And error:
Exception in thread Thread-2:Traceback (most recent call last):
File "/Users/user/Documents/jd-gui-osx-1.6.6/jython-standalone-2.7.0.jar/Lib/threading.py", line 222, in _Thread__bootstrap
self.run()
File "/Users/user/Documents/jd-gui-osx-1.6.6/jython-standalone-2.7.0.jar/Lib/threading.py", line 213, in run
self._target(*self._args, **self._kwargs)
File "/var/folders/n6/n3x71ldn5flc4z9lz79bgpqc0000gn/T/tmpveinaR/inql/utils.py", line 154, in async_run
File "/var/folders/n6/n3x71ldn5flc4z9lz79bgpqc0000gn/T/tmpveinaR/inql/widgets/tab.py", line 296, in async_run
File "/var/folders/n6/n3x71ldn5flc4z9lz79bgpqc0000gn/T/tmpveinaR/inql/introspection.py", line 277, in init
File "/Users/user/Documents/jd-gui-osx-1.6.6/jython-standalone-2.7.0.jar/Lib/json/init.py", line 338, in loads
return _default_decoder.decode(s)
File "/Users/user/Documents/jd-gui-osx-1.6.6/jython-standalone-2.7.0.jar/Lib/json/decoder.py", line 365, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer, but got <type 'NoneType'>

Any ideas how I can fix this?

Not able to install inql

jython -m pip install inql DEPRECATION: A future version of pip will drop support for Python 2.7. Collecting inql ERROR: Could not find a version that satisfies the requirement inql (from versions: none) ERROR: No matching distribution found for inql
smuralik@smuralik-NUC8i7BEH:~$ python -V Python 2.7.18

Burp Extension: Setting custom headers (e.g. auth)

Hi!

Loving your tool so far, thank you 🙇

I'm used to running this tool from the cli. When doing so, I would always set --headers in case a custom header such as an auth token is needed to do introspection (this is a common scenario). I haven't found a way to do that using the Burp extension. The only way to add a header is after a schema is loaded, which is pointless as I need a header to load the schema in the first place.

Am I missing something?

Thanks!

Leandro

Using Cookie instead of API Authentication Key in InQL CLI

Describe the bug
I am trying to use InQL CLI on my corporate GraphQL Federation endpoint. However, I don't have an API authentication key and we authorise via JSESSIONID.

To Reproduce
Steps to reproduce the behaviour:

  1. Using the 'InQL CLI' --> inql -t https://xyx/endpoint --header 'Cookie: JSESSIONID=xxxx' 'Content-Type: application/json' (I am using Content-Type because it requires second header).

Output

[!] Invalid header name b'Cookie: Jsessionid=xxxx'
Traceback (most recent call last):
  File "/usr/local/bin/inql", line 4, in <module>
    __import__('pkg_resources').run_script('inql===2.0.0-3-ge821020', 'inql')
  File "/usr/local/lib/python3.8/site-packages/pkg_resources/__init__.py", line 665, in run_script
    self.require(requires)[0].run_script(script_name, ns)
  File "/usr/local/lib/python3.8/site-packages/pkg_resources/__init__.py", line 1470, in run_script
    exec(script_code, namespace, namespace)
  File "/usr/local/lib/python3.8/site-packages/inql-2.0.0_3_ge821020-py3.8.egg/EGG-INFO/scripts/inql", line 9, in <module>
  File "/usr/local/lib/python3.8/site-packages/inql-2.0.0_3_ge821020-py3.8.egg/inql/introspection.py", line 213, in main
  File "/usr/local/lib/python3.8/site-packages/inql-2.0.0_3_ge821020-py3.8.egg/inql/introspection.py", line 277, in init
  File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/json/__init__.py", line 341, in loads
    raise TypeError(f'the JSON object must be str, bytes or bytearray, '
TypeError: the JSON object must be str, bytes or bytearray, not NoneType

Expected behaviour
I am not sure about the error but I think I shouldn’t be needing to provide a key "-k"

Screenshots
N/A

Desktop (please complete the following information):

  • OS: macOS Catalina 10.15.7
  • Java Version: java 14.0.1 2020-04-14
    Java(TM) SE Runtime Environment (build 14.0.1+7)
    Java HotSpot(TM) 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)
  • Python Version: Python 3.8.5

Additional context
N/A

Integrate Schema Cycle Detection

One thing GraphQL is especially prone to is DOS attacks.

A problem with GraphQL is that the freedom of creating customized requests allows data to be included several times in the response, growing the response’s size exponentially.

("Detecting Cycles in GraphQL Schemas", Lind and Soames, 2019)

The paper above is quite a good read. There are various measures to mitigate this issue (limiting query depth, computing query cost, ...).

You can find cycles quite easily via their tool: https://github.com/LiUGraphQL/graphql-schema-cycles.

Only toyed around with the webapp so far, but doesn't seem too hard to integrate.
Definitely a good one for this collection, imo.

Load is broken

Trying to load a json schema file and point to an known good graphQL path and neither is working. I see the documentation file in playground looks okay. No clue why this isn't working.

TypeError: 'NoneType' object has no attribute '__getitem__'

I keep getting this error when I use the -t flag. Please help!

I have tried it in Kali as well as Mac.

Traceback (most recent call last):
File "GraphQL_Introspection.py", line 395, in
main()
File "GraphQL_Introspection.py", line 214, in main
if result['data']['__schema']['subscriptionType']['name'] is not None:
TypeError: 'NoneType' object has no attribute 'getitem'

OSError: unlink(): an unknown error occurred

Describe the bug
Extension is not working at all

To Reproduce
Steps to reproduce the behavior:

  1. Go to Burp extender tab
  2. Click on BApp Store
  3. Click on InQL - Introspection GraphQL Scanner
  4. Click on Install
  5. See error in burp extensions' errors log

Expected behavior
Extension to be loaded and running

Screenshots
image

Desktop (please complete the following information):

  • OS: Windows 10
  • Java Version: java 9.0.4
  • Python Version: Jython v2.7.2/Python 3.9.6
  • Burp Version: 2022.1.1
  • Version: 4.0.5

Additional context

Traceback (most recent call last):
  File "C:\*\*\*\*\*\*\*\*\*\*\*\*\AppData\Roaming\BurpSuite\bapps\296e9a0730384be4b2fffef7b4e19b1f\ext\inql_burp.py", line 78, in <module>
    from burp_ext.extender import BurpExtender
  File "C:\*\*\*\*\*\*\*\*\*\*\*\*\AppData\Local\BurpSuitePro\jython-standalone-2.7.2.jar\Lib\contextlib$py.class", line 24, in __exit__
  File "C:\*\*\*\*\*\*\*\*\*\*\*\*\AppData\Local\BurpSuitePro\jython-standalone-2.7.2.jar\Lib\contextlib$py.class", line 24, in __exit__
  File "C:\*\*\*\*\*\*\*\*\*\*\*\*\AppData\Roaming\BurpSuite\bapps\296e9a0730384be4b2fffef7b4e19b1f\ext\inql_burp.py", line 14, in __stickytape_temporary_dir
    shutil.rmtree(dir_path)
  File "C:\*\*\*\*\*\*\*\*\*\*\*\*\AppData\Local\BurpSuitePro\jython-standalone-2.7.2.jar\Lib\shutil$py.class", line 247, in rmtree
  File "C:\*\*\*\*\*\*\*\*\*\*\*\*\AppData\Local\BurpSuitePro\jython-standalone-2.7.2.jar\Lib\shutil$py.class", line 252, in rmtree
  File "C:\*\*\*\*\*\*\*\*\*\*\*\*\AppData\Local\BurpSuitePro\jython-standalone-2.7.2.jar\Lib\shutil$py.class", line 250, in rmtree
OSError: unlink(): an unknown error occurred: C:\*\*\*\*\*\*\*\*\*\*\*\*\AppData\Local\Temp\tmpvgrau_\burp_ext\__init__.py


	at org.python.core.PyException.doRaise(PyException.java:211)
	at org.python.core.Py.makeException(Py.java:1638)
	at org.python.core.Py.makeException(Py.java:1642)
	at org.python.core.Py.makeException(Py.java:1646)
	at org.python.core.Py.makeException(Py.java:1650)
	at shutil$py.onerror$16(shutil.py:226)
	at shutil$py.call_function(shutil.py)
	at org.python.core.PyTableCode.call(PyTableCode.java:173)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:306)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:158)
	at org.python.core.PyFunction.__call__(PyFunction.java:437)
	at shutil$py.rmtree$14(shutil.py:256)
	at shutil$py.call_function(shutil.py)
	at org.python.core.PyTableCode.call(PyTableCode.java:173)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:168)
	at org.python.core.PyFunction.__call__(PyFunction.java:437)
	at shutil$py.rmtree$14(shutil.py:256)
	at shutil$py.call_function(shutil.py)
	at org.python.core.PyTableCode.call(PyTableCode.java:173)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:306)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:126)
	at org.python.core.PyFunction.__call__(PyFunction.java:416)
	at org.python.pycode._pyx5.__stickytape_temporary_dir$1(C:/*\*\*\*\*\*\*\*\*\*\*\*/AppData/Roaming/BurpSuite/bapps/296e9a0730384be4b2fffef7b4e19b1f/ext/inql_burp.py:14)
	at org.python.pycode._pyx5.call_function(C:/*\*\*\*\*\*\*\*\*\*\*\*/AppData/Roaming/BurpSuite/bapps/296e9a0730384be4b2fffef7b4e19b1f/ext/inql_burp.py)
	at org.python.core.PyTableCode.call(PyTableCode.java:173)
	at org.python.core.PyGenerator.__iternext__(PyGenerator.java:161)
	at org.python.core.PyGenerator.__iternext__(PyGenerator.java:143)
	at org.python.core.PyIterator.next(PyIterator.java:45)
	at org.python.core.PyGenerator.generator_next(PyGenerator.java:95)
	at org.python.core.PyGenerator$generator_next_exposer.__call__(Unknown Source)
	at org.python.core.PyObject.__call__(PyObject.java:450)
	at contextlib$py.__exit__$4(contextlib.py:51)
	at contextlib$py.call_function(contextlib.py)
	at org.python.core.PyTableCode.call(PyTableCode.java:173)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:187)
	at org.python.core.PyFunction.__call__(PyFunction.java:449)
	at org.python.core.PyMethod.__call__(PyMethod.java:171)
	at org.python.core.ContextGuard.__exit__(ContextGuard.java:29)
	at org.python.pycode._pyx5.f$0(C:/*\*\*\*\*\*\*\*\*\*\*\*/AppData/Roaming/BurpSuite/bapps/296e9a0730384be4b2fffef7b4e19b1f/ext/inql_burp.py:78)
	at org.python.pycode._pyx5.call_function(C:/*\*\*\*\*\*\*\*\*\*\*\*/AppData/Roaming/BurpSuite/bapps/296e9a0730384be4b2fffef7b4e19b1f/ext/inql_burp.py)
	at org.python.core.PyTableCode.call(PyTableCode.java:173)
	at org.python.core.PyCode.call(PyCode.java:18)
	at org.python.core.Py.runCode(Py.java:1687)
	at org.python.core.__builtin__.execfile_flags(__builtin__.java:535)
	at org.python.util.PythonInterpreter.execfile(PythonInterpreter.java:287)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at burp.c8o.<init>(Unknown Source)
	at burp.ba0.a(Unknown Source)
	at burp.ctj.lambda$panelLoaded$0(Unknown Source)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
	at java.base/java.lang.Thread.run(Thread.java:831)

No inql output from loaded schema

Hi,
I have trying to load a graphql schema but there is no output. In the extender tab I see this.

InQL Scanner Started! (tmpdir: /private/var/folders/5g/4dbw14jd3rd_rv7_bjggfcqm0000gn/T/tmpp4Y8U0 )
Cannot disable HTTP/2! invalid literal for int() with base 10: '3.9'
Loading JSON schema from: /Users/....../Documents/....../schema.json
Proxy ENABLED: localhost:8080
Parsing local schema file
Writing Introspection Schema JSON
DONE
Writing HTML Documentation

There are no errors. I am using an m1 macbook air on macOS Monterey.
schema.txt

Sorting Timestamp error in inQL Timer

Describe the bug
Clicking on the Timestamp in the inQL Timer list causes Java error

To Reproduce
Steps to reproduce the behavior:

  1. Go to inQL Timer
  2. Click on Timestamp
  3. See error

Expected behavior
It should sort the items but it cannot cast java.time.LocalDateTime to java.lang.String

Screenshots
image

Desktop (please complete the following information):

  • OS: Windows 10
  • Java Version: 15.0.1+9-18
  • Python Version: Jython v2.7.2
  • Burp Version: burpsuite_pro_v2021.10.3
  • Version: Latest BApp Store Version

Error trying to open documentation in browser

Describe the bug
When right clicking the automatically created documentation shown on the InQL Scanner tab and selecting Open In Browser, it doesn't open. If I go to the Extender tab and click on InQL in the Extensions list, an erorr like the one below is displayed on the Ouput tab:
Cannot open url file://C:\Users\xxxxxxx\AppData\Local\Temp\tmple3vad\api.xxxxxxx.xxx.xx\doc-2021-07-25-1627250916.html!!!
I can manually go to the location of the file and open it successfully. Although the content seems ok, the formatting of the document doesn't seem to be the same as shown in https://blog.doyensec.com/2018/05/17/graphql-security-overview.html because there is no indentation which makes it harder to read.

To Reproduce
Steps to reproduce the behavior:

  1. Add InQL extension
  2. Load a graphql endpoint
  3. Right click on the auto created document and select Open In Browser
  4. Go to the Output of the InQL extension on Extender tab and see error

Expected behavior
I have the latest version of Firefox as my default browser. I haven't had any issues with other software unable to open documents.

Screenshots
image
image
image

Desktop (please complete the following information):

  • OS: Windows 10 Pro v20H2 Build 19042.1110
  • Java Version: [e.g. java -v output, if applicable]
  • Python Version: Jython v2.7.2/Python 3.8.10
  • Burp Version: Pro 2021.6.2
  • Version: 4.0.3

Any plans for python3?

You know, python2 will be deprecated and no longer maintained soon.
I can still run this with python2 but do you have any plans for port to python3?
Thanks.

Cannot install standalone UI on OSX

Describe the bug

jython -m pip install inql                                                                           
DEPRECATION: A future version of pip will drop support for Python 2.7.
Collecting inql
  ERROR: Could not find a version that satisfies the requirement inql (from versions: none)
ERROR: No matching distribution found for inql

To Reproduce

  1. Install jython via homebrew
  2. Verify jython works: jython --version -> Jython 2.7.2
  3. Attempt to install inql as per the README: jython -m pip install inql -> Results in the error mentioned above

Expected behavior

Successful installation of standalone inql

Desktop (please complete the following information):

  • OS: macOS Catalina 10.15.7
  • Java Version: openjdk 16.0.1 2021-04-20 / OpenJDK Runtime Environment Homebrew (build 16.0.1+0)
  • Python Version: Jython 2.7.2 / Python 2.7.16

No visual error output if GraphQL introspection is not allowed on the webserver

Describe the bug
No visual error output if GraphQL introspection is not allowed on the webserver

To Reproduce
Steps to reproduce the behavior:

  1. Go to inQL scanner
  2. Paste the URL
  3. Click on load
  4. No output will be shown

Expected behavior
An error message should be shown since the request failed due to GraphQL introspection not being allowed.

Desktop (please complete the following information):

  • OS: Windows 10 2004
  • Java Version: openjdk version "14.0.1" 2020-04-14
  • Python Version: 3.8
  • Burp Version: 2020.5

HTTP/2 issues

I was unable to get a GraphQL scan for the following URL working:
https://api.myactions.eu/graphql

However, after disabling HTTP/2 support in Burp it suddenly works.

The following error is given in the plugin error log which might be related:

  File "/opt/BurpSuitePro/jython-standalone-2.7.2.jar/Lib/threading$py.class", line 222, in _Thread__bootstrap
    self.run()
  File "/opt/BurpSuitePro/jython-standalone-2.7.2.jar/Lib/threading$py.class", line 213, in run
    self._target(*self._args, **self._kwargs)
  File "/tmp/tmpyNUu2x/inql/utils.py", line 159, in async_run
  File "/tmp/tmpyNUu2x/inql/widgets/generator.py", line 312, in async_run
  File "/tmp/tmpyNUu2x/inql/introspection.py", line 281, in init
  File "/opt/BurpSuitePro/jython-standalone-2.7.2.jar/Lib/json/__init__$py.class", line 338, in loads
    return _default_decoder.decode(s)
  File "/opt/BurpSuitePro/jython-standalone-2.7.2.jar/Lib/json/decoder$py.class", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer, but got <type 'NoneType'>```

As for now disabling HTTP/2 seems to be needed to make the InQL plugin work.

OSError: unlink(): an unknown error occurred: __init__.py

Traceback (most recent call last):
File "C:\Users\Administrator\Downloads\burp\inql_burp.py", line 45, in
__stickytape_write_module('''inql/widgets/init.py''', '''''')
File "C:\Users\Administrator\Downloads\burp\jython-standalone-2.7.2.jar\Lib\contextlib.py", line 35, in exit
File "C:\Users\Administrator\Downloads\burp\inql_burp.py", line 14, in _stickytape_temporary_dir
shutil.rmtree(dir_path)
File "C:\Users\Administrator\Downloads\burp\jython-standalone-2.7.2.jar\Lib\shutil.py", line 247, in rmtree
File "C:\Users\Administrator\Downloads\burp\jython-standalone-2.7.2.jar\Lib\shutil.py", line 247, in rmtree
File "C:\Users\Administrator\Downloads\burp\jython-standalone-2.7.2.jar\Lib\shutil.py", line 252, in rmtree
File "C:\Users\Administrator\Downloads\burp\jython-standalone-2.7.2.jar\Lib\shutil.py", line 250, in rmtree
OSError: unlink(): an unknown error occurred: C:\Users\Administrator\AppData\Local\Temp\tmphoyoka\inql\actions_init
.py

at org.python.core.PyException.doRaise(PyException.java:211)
at org.python.core.Py.makeException(Py.java:1638)
at org.python.core.Py.makeException(Py.java:1642)
at org.python.core.Py.makeException(Py.java:1646)
at org.python.core.Py.makeException(Py.java:1650)
at contextlib$py.__exit__$4(C:/Users/Administrator/Downloads/burp/jython-standalone-2.7.2.jar/Lib/contextlib.py:51)
at contextlib$py.call_function(C:/Users/Administrator/Downloads/burp/jython-standalone-2.7.2.jar/Lib/contextlib.py)
at org.python.core.PyTableCode.call(PyTableCode.java:173)
at org.python.core.PyBaseCode.call(PyBaseCode.java:187)
at org.python.core.PyFunction.__call__(PyFunction.java:449)
at org.python.core.PyMethod.__call__(PyMethod.java:171)
at org.python.core.ContextGuard.__exit__(ContextGuard.java:29)
at org.python.pycode._pyx4.f$0(C:/Users/Administrator/Downloads/burp/inql_burp.py:79)
at org.python.pycode._pyx4.call_function(C:/Users/Administrator/Downloads/burp/inql_burp.py)
at org.python.core.PyTableCode.call(PyTableCode.java:173)
at org.python.core.PyCode.call(PyCode.java:18)
at org.python.core.Py.runCode(Py.java:1687)
at org.python.core.__builtin__.execfile_flags(__builtin__.java:535)
at org.python.util.PythonInterpreter.execfile(PythonInterpreter.java:287)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at burp.ar4.<init>(Unknown Source)
at burp.c2x.a(Unknown Source)
at burp.cyy.lambda$panelLoaded$0(Unknown Source)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at java.base/java.lang.Thread.run(Thread.java:832)

1

UnicodeEncodeError: 'ascii' codec can't encode unicode character

Traceback (most recent call last):
File "GraphQL_Introspection.py", line 831, in
main()
File "GraphQL_Introspection.py", line 616, in main
rt[i]['fields'][j]['args'][x]['description']))
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 110: ordinal not in range(128)

Discard Report for 'Exposed GraphQL Development Console' if response is 404

Describe the bug
Do not report a 'Exposed GraphQL Development Console' low issue in Burp if the server responds with a 404

To Reproduce
Steps to reproduce the behavior:

  1. Go to any website
  2. Request to /graphiql
  3. See error on Burp even if the server responds with a 404

Expected behavior
Do not report the issue

Screenshots

Request:
Screenshot_20210927_110704

Response:
Screenshot_20210927_110737

Issue:
Screenshot_20210927_110854

Desktop (please complete the following information):

  • OS: Ubuntu Linux 20.04
  • Java Version: openjdk 11.0.11
  • Python Version: 3.8.10
  • Burp Version: 2021.8.3
  • Version: 4.0.5

load extensions failed

Describe the bug
A clear and concise description of what the bug is.
when i try to load the extensions , some error occurred and i can't figure it out :
image

the errors:
Traceback (most recent call last):
File "C:\Users\J\AppData\Roaming\BurpSuite\bapps\296e9a0730384be4b2fffef7b4e19b1f\ext\inql_burp.py", line 76, in
if platform.system() == "Java":
File "F:\�页�载\jython-standalone-2.7.1.jar\Lib\platform.py", line 1396, in system
File "F:\�页�载\jython-standalone-2.7.1.jar\Lib\platform.py", line 1213, in uname
at org.python.core.PyString.(PyString.java:57)
at org.python.core.PyString.(PyString.java:70)
at org.python.core.PyString.(PyString.java:74)
at org.python.core.Py.newString(Py.java:647)
at org.python.modules.posix.PosixModule.uname(PosixModule.java:1173)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: Cannot create PyString with non-byte value

at org.python.core.PyException.doRaise(PyException.java:205)
at org.python.core.Py.makeException(Py.java:1565)
at org.python.core.Py.makeException(Py.java:1569)
at org.python.core.Py.makeException(Py.java:1573)
at org.python.core.Py.makeException(Py.java:1577)
at org.python.pycode._pyx5.f$0(C:\Users\J\AppData\Roaming\BurpSuite\bapps\296e9a0730384be4b2fffef7b4e19b1f\ext\inql_burp.py:77)
at org.python.pycode._pyx5.call_function(C:\Users\J\AppData\Roaming\BurpSuite\bapps\296e9a0730384be4b2fffef7b4e19b1f\ext\inql_burp.py)
at org.python.core.PyTableCode.call(PyTableCode.java:171)
at org.python.core.PyCode.call(PyCode.java:18)
at org.python.core.Py.runCode(Py.java:1614)
at org.python.core.__builtin__.execfile_flags(__builtin__.java:535)
at org.python.util.PythonInterpreter.execfile(PythonInterpreter.java:286)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at burp.fnl.<init>(Unknown Source)
at burp.fm9.a(Unknown Source)
at burp.fl5.lambda$panelLoaded$0(Unknown Source)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at java.base/java.lang.Thread.run(Thread.java:831)

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: win10
  • Java Version: jdk1.6
  • Python Version: python 3.8
  • Burp Version: 2021.4

Additional context
Add any other context about the problem here.

License Information

Hi,
Really great work @VoidSec! I really appreciate the project and the efforts you have put into it. We would like to use the project for a commercial training online/classroom. So, I just wanted to clarify, if we acknowledge the source, would that be sufficient and covered under the terms of use?

Inql hangs on start when attemping to start with jython

Describe the bug
Inql hangs on start. When I start the java icon pops up in the task bar, and CPU usage for jython goes to ~120%. Then it stays there and nothing more happens. Installed running jython -m pip install inql

$ jython -m inql
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.python.core.io.StreamIO (file:/usr/local/Cellar/jython/2.7.2/libexec/jython.jar) to field java.io.FilterOutputStream.out
WARNING: Please consider reporting this to the maintainers of org.python.core.io.StreamIO
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

Expected behavior
InQL UI starts.

Screenshots
Just to clarify, this is all I see
Skärmavbild 2020-12-18 kl  06 29 40

Desktop (please complete the following information):

  • OS: macOS Catalina 10.15.7
  • Java Version
openjdk version "15.0.1" 2020-10-20
OpenJDK Runtime Environment (build 15.0.1+9)
OpenJDK 64-Bit Server VM (build 15.0.1+9, mixed mode, sharing)
  • Python Version: 3.9

InQL scanner not scanning the given url

Hi,
I input my url, schemas and even the https://anilist.co/graphiql but as soon as I press the Enter key, nothing changes and the input fields clears, regardless of how long I wait.

I am using this extension in BurpSuite Community Edition v2020.5.

Burp inQL Does not load the results

Describe the bug
Hi, thanks for the great extension. I have setup the required cookies via the load headers and URL and press enter. inQL launches the request, burp interception shows the request is as should be and the response contains all the expected response (parameters, objects etc.), However, the plugin dashboard is still empty - so I cannot review results and perform further actions.

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error
    The extender output shows:
    Quering GraphQL schema from: https://[obfuscated]/api/graph
    Proxy ENABLED: localhost:8080
    Detect arguments is ENABLED, known types will be replaced with placeholder values
    HTTP/2
    Quering GraphQL schema from: https://[obfuscated]/api/graphql
    Proxy ENABLED: localhost:8080
    Detect arguments is ENABLED, known types will be replaced with placeholder values
    HTTP/2
    Quering GraphQL schema from: https://[obfuscated]/api/graphql
    Proxy ENABLED: localhost:8080
    Detect arguments is ENABLED, known types will be replaced with placeholder values
    HTTP/2
    Expected behavior
    A clear and concise description of what you expected to happen.
    Results should be demonstrated on screen.
    Screenshots
    Sending to repeater shows request/response as follows:
    image

Desktop (please complete the following information):

  • OS: Windows 10
  • Java Version:
    java version "15.0.1" 2020-10-20 Java(TM) SE Runtime Environment (build 15.0.1+9-18) Java HotSpot(TM) 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing)
  • Python Version: Python 3.9.5
  • Burp Version: 2021.5.1
  • Version: [e.g. 22]

Additional context
running the inQL cli from ubuntu provides me the json results fine.
Could you please assist in resolving this. Thanks a lot!

Question: HTTP Error 401: Unauthorized

Describe the bug
It is rather a question to seek help for authentication.
We would like to authenticate via inQL command line, but enable to do so.

To Reproduce
Steps to reproduce the behavior:

  1. Authenticate with the keycloak instance, either via postman / browser etc, or via curl eg.
    curl --data "grant_type=password&username=x&password=y&client_id=fcn-web" http://localhost:8080/auth/realms/FCN/protocol/openid-connect/token

We get response like:
"access_token":XXXXXX",
"expires_in":300,
"refresh_expires_in":1800,
"refresh_token":"XXXX",
"token_type":"bearer",
"not-before-policy":1588264961,
"session_state":"XXXX",
"scope":"profile email"

  1. Try to pass Authorization code ("access_token" received) via -k (API Authentication Key)
    inql -t https://localhost/graphql -k XXX

  2. Response is : [!] HTTP Error 401: Unauthorized

Expected behavior
Expecting to login

Screenshots

Desktop (please complete the following information):
inQL command line tool

Additional context
Add any other context about the problem here.

Error on loading [undisclosed] endpoint.

When loading a GraphQL API the plugin crashes, the introspection query works I can see it in the logger.

Traceback (most recent call last):
  File "/var/folders/rn/8g3wbky125nghvbyw9whlt3r0000gn/T/tmp1MdcO6/burp_ext/extender.py", line 45, in registerExtenderCallbacks
  File "/var/folders/rn/8g3wbky125nghvbyw9whlt3r0000gn/T/tmp1MdcO6/inql/burp_ext/timer_tab.py", line 35, in __init__
  File "/var/folders/rn/8g3wbky125nghvbyw9whlt3r0000gn/T/tmp1MdcO6/inql/widgets/timer.py", line 62, in __init__
TypeError: javax.swing.JComboBox(): 1st arg can't be coerced to java.util.Vector, java.lang.Object[], javax.swing.ComboBoxModel

	at org.python.core.Py.TypeError(Py.java:259)
	at org.python.core.PyReflectedFunction.throwError(PyReflectedFunction.java:209)
	at org.python.core.PyReflectedFunction.throwBadArgError(PyReflectedFunction.java:312)
	at org.python.core.PyReflectedFunction.throwError(PyReflectedFunction.java:321)
	at org.python.core.PyReflectedConstructor.__call__(PyReflectedConstructor.java:177)
	at org.python.core.PyObject.__call__(PyObject.java:419)
	at org.python.core.PyMethod.instancemethod___call__(PyMethod.java:237)
	at org.python.core.PyMethod.__call__(PyMethod.java:228)
	at org.python.core.PyMethod.__call__(PyMethod.java:223)
	at org.python.core.Deriveds.dispatch__init__(Deriveds.java:19)
	at org.python.core.PyObjectDerived.dispatch__init__(PyObjectDerived.java:1112)
	at org.python.core.PyType.type___call__(PyType.java:1713)
	at org.python.core.PyType.__call__(PyType.java:1696)
	at org.python.core.PyObject.__call__(PyObject.java:461)
	at org.python.core.PyObject.__call__(PyObject.java:465)
	at inql.widgets.timer$py.__init__$2(/var/folders/rn/8g3wbky125nghvbyw9whlt3r0000gn/T/tmp1MdcO6/inql/widgets/timer.py:95)
	at inql.widgets.timer$py.call_function(/var/folders/rn/8g3wbky125nghvbyw9whlt3r0000gn/T/tmp1MdcO6/inql/widgets/timer.py)
	at org.python.core.PyTableCode.call(PyTableCode.java:167)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:307)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:198)
	at org.python.core.PyFunction.__call__(PyFunction.java:482)
	at org.python.core.PyFunction.__call__(PyFunction.java:476)
	at org.python.core.PyInstance.__init__(PyInstance.java:124)
	at org.python.core.PyClass.__call__(PyClass.java:193)
	at org.python.core.PyObject.__call__(PyObject.java:394)
	at inql.burp_ext.timer_tab$py.__init__$2(/var/folders/rn/8g3wbky125nghvbyw9whlt3r0000gn/T/tmp1MdcO6/inql/burp_ext/timer_tab.py:35)
	at inql.burp_ext.timer_tab$py.call_function(/var/folders/rn/8g3wbky125nghvbyw9whlt3r0000gn/T/tmp1MdcO6/inql/burp_ext/timer_tab.py)
	at org.python.core.PyTableCode.call(PyTableCode.java:167)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:307)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:198)
	at org.python.core.PyFunction.__call__(PyFunction.java:482)
	at org.python.core.PyMethod.instancemethod___call__(PyMethod.java:237)
	at org.python.core.PyMethod.__call__(PyMethod.java:228)
	at org.python.core.PyMethod.__call__(PyMethod.java:223)
	at org.python.core.Deriveds.dispatch__init__(Deriveds.java:19)
	at org.python.core.PyObjectDerived.dispatch__init__(PyObjectDerived.java:1112)
	at org.python.core.PyType.type___call__(PyType.java:1713)
	at org.python.core.PyType.__call__(PyType.java:1696)
	at org.python.core.PyObject.__call__(PyObject.java:478)
	at org.python.core.PyObject.__call__(PyObject.java:482)
	at burp_ext.extender$py.registerExtenderCallbacks$2(/var/folders/rn/8g3wbky125nghvbyw9whlt3r0000gn/T/tmp1MdcO6/burp_ext/extender.py:47)
	at burp_ext.extender$py.call_function(/var/folders/rn/8g3wbky125nghvbyw9whlt3r0000gn/T/tmp1MdcO6/burp_ext/extender.py)
	at org.python.core.PyTableCode.call(PyTableCode.java:167)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:307)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:198)
	at org.python.core.PyFunction.__call__(PyFunction.java:482)
	at org.python.core.PyMethod.instancemethod___call__(PyMethod.java:237)
	at org.python.core.PyMethod.__call__(PyMethod.java:228)
	at org.python.core.PyMethod.__call__(PyMethod.java:218)
	at org.python.core.PyMethod.__call__(PyMethod.java:213)
	at org.python.core.PyObject._jcallexc(PyObject.java:3626)
	at org.python.core.PyObject._jcall(PyObject.java:3658)
	at org.python.proxies.burp_ext.extender$BurpExtender$27.registerExtenderCallbacks(Unknown Source)
	at burp.h1k.run(Unknown Source)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
	at java.base/java.lang.Thread.run(Thread.java:832)
Traceback (most recent call last):
  File "/var/folders/rn/8g3wbky125nghvbyw9whlt3r0000gn/T/tmp1MdcO6/inql/burp_ext/timer_tab.py", line 98, in processHttpMessage
AttributeError: 'TimerTab' object has no attribute 'panel'

	at org.python.core.Py.AttributeError(Py.java:205)
	at org.python.core.PyObject.noAttributeError(PyObject.java:1013)
	at org.python.core.PyObject.__getattr__(PyObject.java:1008)
	at inql.burp_ext.timer_tab$py.processHttpMessage$12(/var/folders/rn/8g3wbky125nghvbyw9whlt3r0000gn/T/tmp1MdcO6/inql/burp_ext/timer_tab.py:98)
	at inql.burp_ext.timer_tab$py.call_function(/var/folders/rn/8g3wbky125nghvbyw9whlt3r0000gn/T/tmp1MdcO6/inql/burp_ext/timer_tab.py)
	at org.python.core.PyTableCode.call(PyTableCode.java:167)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:307)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:198)
	at org.python.core.PyFunction.__call__(PyFunction.java:482)
	at org.python.core.PyMethod.instancemethod___call__(PyMethod.java:237)
	at org.python.core.PyMethod.__call__(PyMethod.java:228)
	at org.python.core.PyMethod.__call__(PyMethod.java:218)
	at org.python.core.PyMethod.__call__(PyMethod.java:213)
	at org.python.core.PyObject._jcallexc(PyObject.java:3626)
	at org.python.core.PyObject._jcall(PyObject.java:3658)
	at org.python.proxies.inql.burp_ext.timer_tab$TimerTab$25.processHttpMessage(Unknown Source)
	at burp.am6.run(Unknown Source)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
	at java.base/java.lang.Thread.run(Thread.java:832)

Desktop:

  • OS: macOS Big Sur
  • Python Version: Jython v2.7.0
  • Burp Version: 2021.5.1
  • Version: 3.1.0

Move "Setup Load Headers" Setting in General Configuration

At the moment, it is possible to set an "Authorization Key" that allows setting a standard HTTP Authorization header (Basic, Bearer)

Screen Shot 2021-10-07 at 10 19 21

Many GraphQL services use cookies or customer headers for authentication. This is not currently supported by InQL. It would be great to extend the configuration and allow settings arbitrary headers. For instance, we can allow users to set arbitrary headers:values that will be appended to all requests.

Stop scraping headers from proxy traffic

Describe the bug
Sending requests from "InQL Scanner" to "Repeater" should inherit headers used during introspection query, not headers seen in other traffic.

To Reproduce
Steps to reproduce the behavior:

  1. Enter GraphQL endpoint into "InQL Scanner" navigation bar and click "Load"
  2. Load some traffic through proxy that uses the same endpoint on a regular webpage
  3. Right click on a query in "InQL Scanner" list and send it to Repeater
  4. Go to Repeater tab and observe that request has headers (and even path) of the last proxied request

Expected behavior
Only generic headers used during querying GraphQL schema should be sent to the Repeater.

Send to Repeater always greyed out

First, this extension is really handy and I'd love to see it in the BApp store.

However, the 'Send to Repeater' option seems to be permanently greyed out. To replicate, paste in https://hackerone.com/graphql (or any other valid endpoint), click Load, and right click on any query template. I've tested on both windows and linux. I'm using Burp Suite Pro v2020.2.1.

It's such an obvious flaw I'm probably just doing something wrong.

Store InQL state per Burp project

Is your feature request related to a problem? Please describe.

  1. InQL stores settings and history in the same place.
  2. Over time the number of existing endpoints in InQL grows and pollutes the InQL Scanner tab.
  3. Previously saved targets get loaded on every next invocation of Burp / InQL and polute new projects.
  4. There is a user expectation that all stuff done in Temporary Project should be held in memory and not stored at disk, but this expectation is broken, because InQL does not make distinction between Temporary Projects and projects stored on disk.

Describe the solution you'd like
Store InQL history per-project. In case of Temporary Projects, don't store history at all.

Additional context
Project data is stored as a JSON string that gets saved by saveExtensionSetting API and gets loaded by corresponding loadExtensionSetting API call. Class name is used as an identification string in this API. In order to separate data per-project, project name should be added to this string.

Burp API does not offer a reliable method of querying current project name and the official suggestion seems to be scraping data from title bar. Burp API is in the process of a revamp though so better ways might appear soon.

GET method?

How can I send GET request with this script?

python GraphQL_Introspection.py -t https://graphql.org/swapi-graphql/
[!] Trying the old introspection query
[!] Query failed! Code 405

Disabling HTTP/2 Error

Describe the bug
It shows the following error upon loading the extension:

Cannot disable HTTP/2! invalid literal for int() with base 10: '10.3'

Desktop (please complete the following information):

  • OS: Windows 10
  • Java Version: 15.0.1+9-18
  • Python Version: Jython v2.7.2
  • Burp Version: burpsuite_pro_v2021.10.3
  • Version: Latest BApp Store Version

How to pass headers in --header

Hi man

at first, thank you for this tool.

but how to add custom header(s) in inql tool !??
i tried a few ways but failed.
1:
--header "{Key1:Val1, Key2:Val2, ........}"
2:
--header "Key1:Val1" --header "Key2:Val2" .................

how to set header !!!???
Tnx

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.